【发布时间】:2017-09-13 06:01:00
【问题描述】:
观察到以下情况:
- Chrome 57.0.2987.133(64 位)
- Firefox 52.0.2(32 位)
- Node.js 6.9.1
以下未观察到:
- 边缘 38.14393.1066.0
在格式化某些早于特定日期的日期时,我在某些浏览器中观察到一种奇怪的行为。
在夏令时(4 月)期间,在巴黎时区进行了以下操作:
new Intl.DateTimeFormat('fr').format(new Date(1975, 9, 26)); // returns "25/10/1975"
new Intl.DateTimeFormat('fr').format(new Date(1975, 9, 27)); // returns "27/10/1975"
如您所见,第一行返回的值不正确。早于 1975-09-26 的所有日期也是如此。
有趣的是,1975-09-26 是法国的日常储蓄更改日期。但是为什么特定年份有问题?夏令时在 1975 年之前生效。
如果我们查看时间,我们会遇到同样的问题:
new Intl.DateTimeFormat('fr', { hour: 'numeric', minute: 'numeric' }).format(new Date(1975, 9, 26, 2, 0)); // returns "01:00"
new Intl.DateTimeFormat('fr', { hour: 'numeric', minute: 'numeric' }).format(new Date(1975, 9, 26, 3, 0)); // returns "03:00"
这不应该发生。格式化的小时应该是 Date.getHours() 返回的那个。
new Date(1975, 9, 26, 2, 0).getHours() // returns 2
由于在 Firefox 和 Chrome 上都观察到了这种情况,我想知道它们是否使用相同的日期格式引擎,以及该引擎中是否存在错误。
另外,我想知道是否可以在另一个具有夏令时的时区复制。
有人有什么见解吗?
编辑:
可能的相关bug:
https://bugs.chromium.org/p/chromium/issues/detail?id=680114 https://bugzilla.mozilla.org/show_bug.cgi?id=1330307
编辑 2:
实际上,旧日期的行为并不总是相同。
这个很有趣:
new Intl.DateTimeFormat('fr', { hour: 'numeric', minute: 'numeric' }).format(new Date(1900, 2, 26, 2, 0)); // returns 00:09
small time difference back then 和马特的回答中提到的错误对此进行了解释。
编辑 3:
仅供参考,法国立法规定在 3 月和 10 月的最后一个星期日切换夏令时。
【问题讨论】:
-
对于我们这些不熟悉 1970 年代 DST 开关的人,您能否将当时的法国立法编辑成问题?谢谢。
-
当您说“以下是在巴黎时区完成的”时,您的实际意思是什么?您的计算机设置为哪个时区?
-
仅供参考 - 法国 did not observe DST in 1975
-
这意味着我的电脑设置为巴黎时区。
-
你的操作系统是什么?
标签: javascript date datetime timezone