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

Javascript 使用toLocalString()方法(Firefox)将日期转换为本地时区,javascript,firefox,internationalization,timezone,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

我计算机上的时区为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

您在Firefox中偶然发现了一个bug。我可以复制你的结果,并解释它们

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

在。这将莫斯科的基准偏移量从UTC+4移至UTC+3。错误在于Firefox看起来很混乱,在其
toLocaleString
函数中使用了旧的+4偏移量,尽管它正确地识别了其他函数中的+3偏移量,如
getTimezoneOffset
toString

当你尝试一个没有经历这种变化的不同时区时,你可以看到这一点。在Windows上,我选择
“(UTC+03:00)内罗毕”
(其基本时区ID为
“东非标准时间”
)。它被定义为始终在UTC+3上的固定区域

然后我关闭Firefox并将时区更改为
(UTC+03:00)莫斯科、圣彼得堡、伏尔加格勒(RTZ 2)
(ID为“俄罗斯标准时间”)。然后重新启动Firefox并执行相同的测试:

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

当然,当你用格式化选项来消磨时间时,这是很难看到的,但这是同样的潜在缺陷

此错误已报告给Mozilla。如果对你很重要,你应该考虑投票。
至于要做什么-一般来说,我目前不建议使用
toLocaleString
功能。ECMA-402已经定义了这一点,这很好,但是它还没有得到广泛的实现,而且这些实现在支持哪些选项方面有些不一致。几年后,这可能是正确的方法,但现在我建议改用。

感谢您提供如此详细的答案!是的,我的时间是莫斯科时间。