在不同时区使用的应用程序中存储Oracle中的日期

Storing dates in Oracle in an app used in different time zones

本文关键字:应用程序 Oracle 日期 存储 时区      更新时间:2024-07-02

我目前正在决定如何处理我的web应用程序,该应用程序使用Oracle存储数据,PHP作为服务器端语言,JavaScript作为客户端。

该应用程序将在英国托管,但来自英国、美国和其他欧洲国家的用户将登录并使用它。此时,如果用户操作导致任何"可审核"事件发生,则会将一条记录保存到审核跟踪中,并根据该记录保存SYSDATE。

当用户查看审核跟踪时,我希望时间显示在他们的本地时区。

我的想法是:-由于SYSDATE是Oracle服务器上系统时钟的时间,我应该将Oracle服务器的时区设置为UTC(夏令时没有更改)。这将确保所有日期都保存在一个恒定的时区中,因此转换它应该不会很困难。-在浏览器中使用JavaScript的getTimezoneOffset()函数将时间转换为本地时间,以添加/减去分钟。

这是正确的方法吗,还是我错过了什么?

在这之前,您的方法听起来不错:

在浏览器中使用JavaScript的getTimezoneOffset()函数将时间转换为本地时间,以添加/减去分钟。

你不想那样做,因为这会带来不同的时刻。如果要将UTC值传递给浏览器,请将其作为ISO8601格式传递,然后在构造函数中使用,例如new Date('2013-01-01T01:23:45.678Z')

如果你需要支持旧的浏览器,或者你想更好地控制格式,那么可以考虑使用moment.js。

此外,您应该注意,如果您使用的值所在的时间段与当前有效的夏令时规则不同,则当前版本的JavaScript可能会将UTC时间转换为夏令时附近的值。你可以在我的博客上阅读更多关于这方面的内容。您将在时间或日期方面遇到此问题。

如果这对你来说很关键,那么你需要避免用JavaScript进行转换,而是用PHP代码进行转换。(当然,这意味着您需要向用户询问他们的时区,例如America/Los_Angeles,这样PHP时区函数就可以使用它了。)

在表和PL/SQL代码中,始终使用数据类型TIMESTAMP WITH LOCAL TIMEZONE。然后,日期和时间总是正确插入并显示在当前用户会话的时区中。

数据类型"TIMESTAMP WITH TIMEZONE"也包含时区信息,但为了正确显示,您必须转换为用户会话时区。当你在美国时,你可能不喜欢看到"2012-12-12 15:45:00-01:00",尽管它代表了正确的时间。

SYSDATE是数据类型"DATE",它不包含任何时区信息,请使用CURRENT_TIMESTAMPLOCALTIMESTAMP作为会话时间戳,使用SYSTIMESTAMP作为Oracle服务器所在的时区。