为什么YYYY-MM-DD!= YYYY / MM / DD

时间:2015-12-02 07:25:56

标签: javascript

在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小时?

3 个答案:

答案 0 :(得分:26)

我认为差异是由Date.parse将UTC添加到一个字符串而不是另一个字符串引起的,即:/不是Date.parse()中的合法分隔符,这意味着UTC不是&# 39; t一旦解析就添加到时间。由于'是合法的分隔符,因此会对其进行解析,然后将UTC添加到返回的时间。

Date.parse方法使用

new Date(),其实现是针对浏览器的,我很惊讶这种事情并不常见。

Date.parse的规范说:

  

String可以解释为本地时间,UTC时间或某个其他时区的时间,具体取决于String的内容。该函数首先尝试根据日期时间字符串格式(15.9.1.15)中调出的规则来解析字符串的格式。如果String不符合该格式,则该函数可以回退到任何特定于实现的启发式或特定于实现的日期格式。

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

答案 1 :(得分:12)

引自V8 source code

此功能的评论

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

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

     

ES5 ISO8601日期:

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

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

短划线( - )是Date的正确表示法。

答案 2 :(得分:1)

这是因为全球化。短划线( - )不是英文符号(GMT)。 Javascript解析表示法。尝试设置文化,然后使用短划线表示法。