我电脑上的时区是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
。
答案 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上的固定区域。
然后我关闭Firefox并将我的时区更改为"E. Africa Standard Time"
(其ID为“俄罗斯标准时间”)。然后我重新启动Firefox并进行相同的测试:
正如您所看到的,在第一次测试中,它获得了"(UTC+03:00) Moscow, St. Petersburg, Volgograd (RTZ 2)"
和toString
的正确答案,但在第二次测试中它们是不同的。 toLocaleString
已经应用了错误的偏移,在10月10日午夜而不是10月9日的正确23:00。
当然,当您使用格式化选项去除时间时,这很难看,但它是相同的底层错误。
此错误已经报告给Mozilla here。如果对您来说很重要,您应该考虑对其进行投票。
至于该怎么做 - 一般来说,我目前不推荐使用toLocaleString
功能。 ECMA-402对此进行了定义非常棒,但它还没有得到广泛实施,而且只要它们支持哪些选项,实现就有些不一致。在几年内,这可能是正确的方法,但现在我建议使用moment.js代替。