对于旧日期,Intl.DateTimeFormat的时区问题

时间:2017-04-17 15:32:53

标签: javascript date datetime timezone

以下观察到:

  • Chrome 57.0.2987.133(64位)
  • Firefox 52.0.2(32位)
  • Node.js 6.9.1

以下内容未被观察到:

  • Edge 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上都观察到的那样,我想知道他们是否使用相同的日期格式化引擎,以及该引擎中是否存在错误。

另外,我想知道是否可以在夏令时的另一个时区再现。

任何人都有任何见解?

编辑:

可能的相关错误:

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月的最后一个星期日切换到夏令时。

1 个答案:

答案 0 :(得分:0)

您遇到了Windows localtime_s功能中的错误。它只考虑当前 DST规则,并假设相同的规则始终有效 - 即使有更好的数据可用。

此错误会多次报告为各种浏览器问题。你已经击中了其中两个。您可以在this StackOverflow Q& A。

中看到它的另一个效果