【问题标题】:Timezone issue with Intl.DateTimeFormat for old dates旧日期的 Intl.DateTimeFormat 时区问题
【发布时间】: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


【解决方案1】:

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

这个错误被多次报告为各种浏览器问题。你已经碰到了其中两个。您可以在this StackOverflow Q&A 中看到它的另一种效果。

【讨论】:

  • 仅适用于 Windows 10 还是旧版本?
  • 另外,很奇怪,Edge 最终成为唯一没有错误的。
  • 也比较老。 Edge 不使用那个特定的 API。有更好的可用。 Chrome 和 Firefox 需要使用它们来修复它们的错误。无论如何,我们正在变得比对 StackOverflow 有用的更深。 :)
  • 这不是必然的错误。从ECMAScript 2015 开始,需要一个实现来使用“最佳可用信息”做出“最大努力”。在此之前,他们只需要应用当前规则as if they had always existed。因此,这只是声称符合 ECMAScript 2015 或更高版本的实现中的一个错误。
  • @MattJohnson 我刚刚在 Linux (Ubuntu) 和 MacOS 10.12.3 上测试了我的代码,我遇到了同样的问题,所以这似乎不仅仅是一个 Windows 问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 2016-12-14
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多