对于我的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 回答
较旧的ECMAScript 5.1规范在§15.9.1.15中说:
这意味着,如果您没有指定偏移量,它将假设您的意思是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规定 .