在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)
为什么' - '似乎增加1小时的时间?
我认为差异是由于Date.parse
将UTC添加到一个字符串而不是另一个字符串引起的,即:/
不是Date.parse()中的合法分隔符,这意味着UTC一旦被解析就不会被添加到时间.因为'
是合法的分隔符,所以会对其进行解析,然后将UTC添加到返回的时间.
Date.parse
该new Date()
方法使用它的方法,它的实现是浏览器特定的,我很惊讶这种事情不会经常出现.
规格Date.parse
说:
String可以解释为本地时间,UTC时间或某个其他时区的时间,具体取决于String的内容.该函数首先尝试根据日期时间字符串格式(15.9.1.15)中调出的规则来解析字符串的格式.如果String不符合该格式,则该函数可以回退到任何特定于实现的启发式或特定于实现的日期格式.
所以我建议你在解析之前手动添加一个时区,或者丢弃返回的时间new Date()
,但这可能导致午夜等问题.最安全的事情是看你是否能以更具体的格式获取日期来自两个系统,带有时区信息.
引用V8源代码.
这个函数的评论
bool DateParser::Parse(Vectorstr, FixedArray* out, UnicodeCache* unicode_cache)
接受与Safari兼容的ES5 ISO 8601日期时间字符串或旧日期.
ES5 ISO 8601日期:
[('-'|'+')yy]yyyy[-MM[-DD]][THH:mm[:ss[.sss]][Z|(+|-)hh:mm]]匹配两种格式的字符串(例如1970-01-01)将被解析为ES5日期时间字符串 - 这意味着它将默认为UTC时区.如果遵循ES5规范,这是不可避免的.
短划线( - )是正确的表示法Date
.