【问题标题】:Convert Date to local time zone with toLocaleString() method (Firefox)使用 toLocaleString() 方法将日期转换为本地时区 (Firefox)
【发布时间】:2016-01-10 02:21:21
【问题描述】:

我电脑上的时区是 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 日) - 这就是问题所在。

如果我将初始日期/时间字符串更改为 2015-10-09T19:59:00.000Z(与初始值相比提前一分钟),Firefox 会给出正确的日期(2015 年 10 月 9 日)。

为什么 Firefox 中的 toLocaleString() 方法会这样?

所有浏览器都安装在同一台计算机上。 Date.getTimezoneOffset() 在所有浏览器中返回 -180

【问题讨论】:

    标签: javascript firefox internationalization timezone


    【解决方案1】:

    您偶然发现了 Firefox 中的一个错误。我可以重现你的结果并解释它们。

    有多个时区使用 UTC+3 偏移量,但从您的结果我可以推断您设置为莫斯科时间。

    2014, Russia set all of its time zones back one hour。这将莫斯科的基本偏移量从 UTC+4 移至 UTC+3。错误是 Firefox 看起来很混乱,并且在其 toLocaleString 函数中使用旧的 +4 偏移量,即使它正确识别了其他函数中的 +3 偏移量,例如 getTimezoneOffsettoString

    您可以在尝试不同的时区时看到这一点,而该时区还没有发生这种变化。在 Windows 上,我选择 "(UTC+03:00) Nairobi"(其基础时区 ID 为 "E. Africa Standard Time")。它被定义为一个始终在 UTC+3 上的固定区域。

    然后我关闭 Firefox 并将我的时区更改为 "(UTC+03:00) Moscow, St. Petersburg, Volgograd (RTZ 2)"(其 ID 为“俄罗斯标准时间”)。然后我重新启动 Firefox 并做同样的测试:

    如您所见,在第一个测试中,toStringtoLocaleString 都得到了正确答案,但在第二个测试中它们是不同的。 toLocaleString 应用了错误的偏移量,到达 10 月 10 日午夜,而不是 10 月 9 日正确的 23:00。

    当然,当您使用格式选项去除时间时,这很难看到,但它是相同的潜在错误。

    此错误已报告给 Mozilla here。如果它对你很重要,你应该考虑投票。

    至于做什么 - 一般来说,我目前不推荐 toLocaleString 函数。很高兴 ECMA-402 定义了这一点,但它还没有被广泛实施,而且就它们支持的选项而言,这些实施有些不一致。几年后这可能是正确的方法,但现在我建议改用moment.js

    【讨论】:

    • 感谢您如此详细的回答!是的,我的时间是莫斯科时间。
    猜你喜欢
    • 2019-03-20
    • 2020-09-08
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    相关资源
    最近更新 更多