使用 toLocaleString() 方法 (Firefox) 将日期转换为本地时区
Convert Date to local time zone with toLocaleString() method (Firefox)
我电脑上的时区是UTC+3。我有以下 JavaScript 代码:
// date in UTC time zone
var date = new Date('2015-10-09T20:00:00.000Z');
var options = {year: "numeric", month: "2-digit", day: "2-digit"};
var output = date.toLocaleString('en-us', options);
在 IE 和 Chrome 中,此代码输出 10/09/2015
(即 2015 年 10 月 9 日),这是正确的,因为 20:00 UTC 是 23:00 我的时间(现在仍然是10 月 9 日)。
但是,在 Firefox 中,输出是 10/10/2015
(即 2015 年 10 月 10 日)- 这就是问题所在。
如果我将初始 date/time 字符串更改为 2015-10-09T19:59:00.000Z
(与初始值相比倒退一分钟),Firefox 会给出正确的日期(2015 年 10 月 9 日)。
为什么 Firefox 中的 toLocaleString()
方法会这样?
所有浏览器都安装在同一台计算机上。 Date.getTimezoneOffset()
returns -180
在所有浏览器中。
您偶然发现了 Firefox 中的一个错误。我可以重现你的结果,并解释它们。
有多个时区使用 UTC+3 偏移量,但从您的结果我可以推断您设置为莫斯科时间。
在2014, Russia set all of its time zones back one hour。这将莫斯科的基准偏移量从 UTC+4 移动到 UTC+3。该错误是 Firefox 似乎混淆了并在其 toLocaleString
函数中使用旧的 +4 偏移量,即使它在其他函数(例如 getTimezoneOffset
和 [=12] 中正确识别了 +3 偏移量=].
您可以在尝试未通过此类更改的其他时区时看到这一点。在 Windows 上,我选择 "(UTC+03:00) Nairobi"
(其基础时区 ID 为 "E. Africa Standard Time"
)。它被定义为一个固定的区域,一直在 UTC+3。
然后我关闭 Firefox 并将我的时区更改为 "(UTC+03:00) Moscow, St. Petersburg, Volgograd (RTZ 2)"
(其 ID 为 "Russian Standard Time")。然后我重新启动 Firefox 并做同样的测试:
如您所见,在第一个测试中它得到 toString
和 toLocaleString
的正确答案,但在第二个测试中它们是不同的。 toLocaleString
应用了错误的偏移量,到达 10 月 10 日午夜而不是正确的 23:00 10 月 9 日。
当然,当您使用格式化选项去除时间时,这更难看到,但它是相同的潜在错误。
此错误已报告给 Mozilla here。如果它对你很重要,你应该考虑投票。
至于做什么 - 总的来说,我目前不推荐 toLocaleString
功能。 ECMA-402 对此进行了定义,这很好,但它尚未得到广泛实施,而且这些实施在支持哪些选项方面有些不一致。几年后这可能是正确的方法,但现在我建议改用 moment.js。
我电脑上的时区是UTC+3。我有以下 JavaScript 代码:
// date in UTC time zone
var date = new Date('2015-10-09T20:00:00.000Z');
var options = {year: "numeric", month: "2-digit", day: "2-digit"};
var output = date.toLocaleString('en-us', options);
在 IE 和 Chrome 中,此代码输出 10/09/2015
(即 2015 年 10 月 9 日),这是正确的,因为 20:00 UTC 是 23:00 我的时间(现在仍然是10 月 9 日)。
但是,在 Firefox 中,输出是 10/10/2015
(即 2015 年 10 月 10 日)- 这就是问题所在。
如果我将初始 date/time 字符串更改为 2015-10-09T19:59:00.000Z
(与初始值相比倒退一分钟),Firefox 会给出正确的日期(2015 年 10 月 9 日)。
为什么 Firefox 中的 toLocaleString()
方法会这样?
所有浏览器都安装在同一台计算机上。 Date.getTimezoneOffset()
returns -180
在所有浏览器中。
您偶然发现了 Firefox 中的一个错误。我可以重现你的结果,并解释它们。
有多个时区使用 UTC+3 偏移量,但从您的结果我可以推断您设置为莫斯科时间。
在2014, Russia set all of its time zones back one hour。这将莫斯科的基准偏移量从 UTC+4 移动到 UTC+3。该错误是 Firefox 似乎混淆了并在其 toLocaleString
函数中使用旧的 +4 偏移量,即使它在其他函数(例如 getTimezoneOffset
和 [=12] 中正确识别了 +3 偏移量=].
您可以在尝试未通过此类更改的其他时区时看到这一点。在 Windows 上,我选择 "(UTC+03:00) Nairobi"
(其基础时区 ID 为 "E. Africa Standard Time"
)。它被定义为一个固定的区域,一直在 UTC+3。
然后我关闭 Firefox 并将我的时区更改为 "(UTC+03:00) Moscow, St. Petersburg, Volgograd (RTZ 2)"
(其 ID 为 "Russian Standard Time")。然后我重新启动 Firefox 并做同样的测试:
如您所见,在第一个测试中它得到 toString
和 toLocaleString
的正确答案,但在第二个测试中它们是不同的。 toLocaleString
应用了错误的偏移量,到达 10 月 10 日午夜而不是正确的 23:00 10 月 9 日。
当然,当您使用格式化选项去除时间时,这更难看到,但它是相同的潜在错误。
此错误已报告给 Mozilla here。如果它对你很重要,你应该考虑投票。
至于做什么 - 总的来说,我目前不推荐 toLocaleString
功能。 ECMA-402 对此进行了定义,这很好,但它尚未得到广泛实施,而且这些实施在支持哪些选项方面有些不一致。几年后这可能是正确的方法,但现在我建议改用 moment.js。