在以下情况下观察到以下内容:
- 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是法国的Dailight储蓄日期。但是,为什么那一年有问题呢?日光节省在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"
这不应该发生。格式化的时间应为按日期返回的一个小时。
new Date(1975, 9, 26, 2, 0).getHours() // returns 2
因为这在Firefox和Chrome上都可以观察到,我想知道它们是否正在使用同一日期格式的引擎,以及该引擎中是否有错误。
另外,我想知道是否可以在另一个时区进行日光节省的时区。
有人有任何见识吗?
编辑:
可能的相关错误:
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
当时的小时差和马特答案中提到的错误来解释。
编辑3:
fyi,法国立法说,将在3月和10月的最后一个星期日转到/从日光节省时间。
您已经击中了Windows localtime_s
函数中的错误。它仅考虑当前 dst规则,并假定同一规则始终有效 - 即使有更好的数据可用。
此错误被报告为各种浏览器问题。您已经击中了其中两个。您可以在此stackoverflow Q& a。