为什么YYYY-MM-DD不等于YYYY/MM/DD?

51
在Chrome中,我们会遇到一些奇怪的问题。
> new Date("2014-01-01") - new Date("2014/01/01")
< 3600000

而这是因为

new Date("2014-01-01")
Wed Jan 01 2014 01:00:00 GMT+0100 (CET)

new Date("2014/01/01")
Wed Jan 01 2014 00:00:00 GMT+0100 (CET)

'-' 为何似乎会将时间加一小时?


看起来它将GMT添加到时间中。 - JNF
3
基本上,我有两个不同的数据源,我想检查一个数据源的结束日期是否等于下一个数据源的开始日期。它们具有不同的格式。当我开始检查 第一个-第二个==0 时,我没有得到任何 True 值。当然我可以控制这个问题,但这会让生活更加复杂。 - Simon H
2
你看过这个吗:https://dev59.com/7WUp5IYBdhLWcg3wtZE0 也许对你有帮助。 - JamesENL
1
也许有用,似乎斜杠不符合规范?链接 - steveax
1
重复问题获得48个赞,呵呵。 - Lightness Races in Orbit
显示剩余8条评论
3个回答

26
我认为这种差异是由于Date.parse将UTC添加到一个字符串中,但未添加到另一个字符串中,也就是说:/在Date.parse()中不是合法的分隔符,这意味着一旦解析后,不会添加UTC到时间中。因为'是合法的分隔符,所以被解析,然后UTC被添加到返回的时间中。 Date.parsenew Date()方法使用,并且其实现是特定于浏览器的,我很惊讶这种情况并没有经常出现。
对于Date.parse的规范说明如下:

该字符串可以根据字符串的内容被解释为本地时间、UTC时间或其他时区的时间。函数首先尝试根据日期时间字符串格式(15.9.1.15)中的规则解析字符串的格式。如果该字符串不符合该格式,则该函数可能会回退到任何特定于实现的启发式算法或特定于实现的日期格式。

因此,我建议在解析之前手动添加时区,或者放弃new Date()返回的时间,但这可能会导致午夜等问题。最安全的方式是查看是否可以从两个系统中获取具有时区信息的更具体的格式日期。

12

引自V8源代码

此函数的注释

bool DateParser::Parse(Vector<Char> str,
                       FixedArray* out,
                       UnicodeCache* unicode_cache)

接受 ES5 ISO 8601 日期字符串或与 Safari 兼容的旧日期格式。

ES5 ISO 8601 日期格式:

[('-'|'+')yy]yyyy[-MM[-DD]][THH:mm[:ss[.sss]][Z|(+|-)hh:mm]]

匹配两种格式(例如1970-01-01)的字符串将被解析为ES5日期时间字符串,这意味着它会默认为UTC时区。如果遵循ES5规范,这是无法避免的。

短横线(-)是Date的正确表记。


1
因为全球化的原因。破折号(-)不是英文符号(GMT)。Javascript会解析这个符号。尝试设置文化并使用破折号符号。

2
实际上,看起来-是可以的,但是/不行。 - Simon H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接