我目前正在尝试决定如何处理我的网络应用程序,它使用Oracle存储数据,PHP作为服务器端语言,JavaScript作为客户端。
该应用程序将在英国托管,但来自英国,美国和其他欧洲国家的人员将登录并使用它。目前,如果由于用户操作而发生任何“可审计”事件,则会将记录保存到审计跟踪中,并对其进行SYSDATE保存。
当用户随后查看审计跟踪时,我希望时间以其本地时区显示。
我在想的是: - 由于SYSDATE是Oracle服务器上系统时钟的时间,我应该将Oracle服务器的时区设置为UTC(夏令时没有变化)。这将确保所有日期都保存在一个恒定时区,因此转换它应该不难。 - 使用JavaScript的getTimezoneOffset()函数在浏览器中将时间转换为本地时间,以添加/减去分钟。
这是正确的方法,还是我错过了什么?
答案 0 :(得分:1)
到目前为止,你的方法听起来很不错:
使用JavaScript的getTimezoneOffset()函数在浏览器中将时间转换为本地时间,以添加/减去分钟数。
你不想那样做,因为它会产生不同的时刻。如果要将UTC值传递给浏览器,请将其作为ISO8601格式传递,并在构造函数中使用它,例如new Date('2013-01-01T01:23:45.678Z')
。
如果您需要支持较旧的浏览器,或者希望更好地控制格式,请考虑使用moment.js代替。
此外,您应该知道,如果您使用的值处于具有不同DST规则的时间段内,当前版本的JavaScript可能会破坏夏令时转换附近值的UTC到本地时间转换比目前生效的那个。您可以阅读有关此on my blog here的更多信息。你会在时刻或日期遇到这个问题。
如果这对您至关重要,那么您需要避免在JavaScript中进行转换,而是在PHP代码中进行转换。 (当然,这意味着您需要询问用户他们的时区,例如America/Los_Angeles
,以便您可以使用PHP时区功能。)
答案 1 :(得分:0)
在表和PL / SQL代码中,始终使用数据类型TIMESTAMP WITH LOCAL TIMEZONE
。然后,日期和时间始终正确插入并显示在当前用户会话的时区中。
数据类型" TIMESTAMP WITH TIMEZONE"还包含时区信息,但为了正确显示,您必须转换为用户会话时区。当你在美国时,你可能不想看到" 2012-12-12 15:45:00 -01:00"虽然它代表了正确的时间。
SYSDATE是数据类型" DATE"它不包含任何时区信息,对会话时间戳使用CURRENT_TIMESTAMP
或LOCALTIMESTAMP
,对Oracle服务器所在的时区使用SYSTIMESTAMP
。