使用toLocaleString()方法将日期转换为本地时区(Firefox)

时间:2015-10-12 14:42:19

标签: javascript firefox internationalization timezone

我电脑上的时区是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

1 个答案:

答案 0 :(得分:1)

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

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

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

尝试使用未经过此类更改的其他时区时,您可以看到此信息。在Windows上,我选择toString(其基础时区ID为"(UTC+03:00) Nairobi")。它被定义为一直在UTC + 3上的固定区域。

test 1

然后我关闭Firefox并将我的时区更改为"E. Africa Standard Time"(其ID为“俄罗斯标准时间”)。然后我重新启动Firefox并进行相同的测试:

test 2

正如您所看到的,在第一次测试中,它获得了"(UTC+03:00) Moscow, St. Petersburg, Volgograd (RTZ 2)"toString的正确答案,但在第二次测试中它们是不同的。 toLocaleString已经应用了错误的偏移,在10月10日午夜而不是10月9日的正确23:00。

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

此错误已经报告给Mozilla here。如果对您来说很重要,您应该考虑对其进行投票。

至于该怎么做 - 一般来说,我目前不推荐使用toLocaleString功能。 ECMA-402对此进行了定义非常棒,但它还没有得到广泛实施,而且只要它们支持哪些选项,实现就有些不一致。在几年内,这可能是正确的方法,但现在我建议使用moment.js代替。