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

Javascript 在不同时区使用的应用程序中存储Oracle中的日期,javascript,oracle,time,timezone,Javascript,Oracle,Time,Timezone,我目前正试图决定如何处理我的web应用程序,它使用Oracle存储数据,PHP作为服务器端语言,JavaScript作为客户端 该应用程序将在英国托管,但来自英国、美国和其他欧洲国家的人将登录并使用它。此时,如果由于用户操作而发生任何“可审核”事件,则会将一条记录保存到审核跟踪中,并根据该记录保存SYSDATE 当用户查看审计跟踪时,我希望时间显示在他们的本地时区中 我想的是: -由于SYSDATE是Oracle服务器上系统时钟的时间,我应该将Oracle服务器的时区设置为UTC(夏令时不做任何

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

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

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

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


这是正确的方法,还是我遗漏了什么?

在您的表和PL/SQL代码中,始终使用带有本地时区的数据类型
时间戳。然后,日期和时间始终正确插入并显示在当前用户会话的时区中

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


SYSDATE是数据类型“DATE”,它不包含任何时区信息,对会话时间戳使用
CURRENT\u TIMESTAMP
LOCALTIMESTAMP
,对Oracle服务器所在的时区使用
SYSTIMESTAMP

到目前为止,您的方法听起来不错:

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

你不想这样做,因为它会在时间上产生一个不同的时刻。如果要将UTC值传递给浏览器,请将其作为ISO8601格式传递,并仅在构造函数中使用,例如
newdate('2013-01-01T01:23:45.678Z')

如果您需要支持旧浏览器,或者希望更好地控制格式设置,那么可以考虑使用。

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


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

您好,谢谢您的回答。不幸的是,我不认为将所有SYSDATEs更改为带有本地时区的TIMESTAMP对我来说是可能的——这将意味着改变成千上万的SQL语句。你认为我的方法行得通吗?如果所有系统日期都存储在UTC中,那么为什么用户在存储它时所在的时区很重要?当向用户显示时,可以将其从UTC转换为用户的时区。