【问题标题】:Same Date(String) gives different results相同的日期(字符串)给出不同的结果
【发布时间】:2018-07-26 11:44:10
【问题描述】:

对于我的 WebApp,我正在使用 Jest 编写单元测试,我的开发环境是 IntelliJ Ultimate 2018.1。

在我的单元测试中,我需要从字符串创建 Date()。我的问题是,当我与同事共享此单元测试时,它不起作用,因为 Date(String) 返回不同的日期(他使用的是相同的开发环境)。

例如,在我的环境中,当我执行 new Date("2018-05-12T19:00:00") 我得到 Sat May 12 2018 19:00:00 GMT+0200(浪漫夏令时间)

当我的同事执行完全相同的代码行时,他得到 2018 年 5 月 12 日星期六 21:00:00 GMT+0200(巴黎,马德里(heure d'été))

当我在日期末尾添加 Z 时,例如 new Date("2018-05-12T19:00:00Z") 我得到 Sat May 12 2018 21:00:00 GMT +0200(浪漫夏季时间),他与 2018 年 5 月 12 日星期六 21:00:00 GMT+0200(巴黎,马德里(heure d'été))获得相同的日期

为什么在使用 new Date("2018-05-12T19:00:00") 时会出现 2 小时的差异?我们在同一个时区。

感谢您的帮助!

【问题讨论】:

  • 因为一个浏览器将其解释为 UTC 而另一个则解释为本地时区。但是您已经找到了解决方案:在字符串上放置一个明确的时区。
  • 我的单元测试由 IntelliJ 中的 Jest 执行。相信运行时环境是 Node.js 而不是浏览器。另外,为什么时区不同? Romance Summer Time 和 Paris/Madrid 是同一时区。
  • 我不是特别了解 Jest,但这只是表明您和您的同事设置了不同的环境。
  • 可能应该关闭,请参阅Why does Date.parse give incorrect results? 但我喜欢 cmets 和答案。 :-)

标签: javascript date timezone jestjs


【解决方案1】:

旧的 ECMAScript 5.1 规范在 §15.9.1.15 中说:

...缺席时区偏移的值为“Z”。

这意味着,如果您不指定偏移量,它将假定您指的是 UTC。

请注意,由于这与 ISO-8601 所说的相反,因此这种行为在 ECMAScript 2015 (6.0) 中已更改,在 §20.3.1.16 中表示:

...如果时区偏移不存在,则日期时间被解释为本地时间。

因此,您的同事似乎正在通过旧版本的 JavaScript 引擎执行代码。根据较新的规范,您的字符串被解释为本地时间,而根据旧规范,他们的字符串被解释为 UTC。既然你说这完全是通过 Node.js,他们应该简单地升级到更新版本的 Node.js。

我不久前blogged about this behavior,如果您想了解更多详情。

如果您想适应旧环境,请考虑自己或使用库解析日期字符串。有很多可供选择。通常,许多人不信任附加到 Date 对象的字符串解析器,因为它多年来发生了变化,具有一些特定于实现的行为,并且仍然会做一些愚蠢的事情,比如假设像 "2018-07-26" 这样的整个日期应该是解释为 UTC 而不是 ISO 8601 指定的本地时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2020-03-12
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    相关资源
    最近更新 更多