首页 文章

相同日期(字符串)给出不同的结果

提问于
浏览
0

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

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

例如,在我的环境中,当我执行新日期(“2018-05-12T 19:00:00 ”)时,我将获得2018年5月12日星期六 19:00:00 GMT 0200(浪漫夏令时)

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

当我在日期结束时添加Z时,如新日期("2018-05-12T19:00:00Z"),我将获得2018年5月12日星期六 21:00:00 GMT 0200(浪漫夏令时),他与2018年5月12日星期六 21:00:00 GMT 0200(巴黎,马德里)相同(heured'été))

为什么我们在使用新日期(“2018-05-12T19:00:00”)时会出现2小时差异?我们在同一时区 .

谢谢你的帮助!

1 回答

  • 0

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

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

    这意味着,如果您没有指定偏移量,它将假设您的意思是UTC .

    请注意,由于这与ISO-8601所说的相反,因此ECMAScript 2015(6.0)中的行为已经改变,在_219685中说:

    ...如果没有时区偏移,则将日期时间解释为本地时间 .

    因此,您的同事似乎正在通过较旧版本的JavaScript引擎执行代码 . 您的字符串被解释为每个较新规范的本地时间,并且他们的字符串被解释为旧规范的UTC . 既然你说这是通过Node.js, they should simply upgrade to a newer version of Node.js.

    我前一段时间,如果你想了解更多细节 .

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

相关问题