为什么javascript以不同方式解释这些相同的日期

时间:2013-02-20 09:42:44

标签: javascript date

这里发生了什么:

> new Date('Apr 15 2013');
Mon Apr 15 2013 00:00:00 GMT+0100 (GMT Daylight Time)
> new Date('04/15/2013');
Mon Apr 15 2013 00:00:00 GMT+0100 (GMT Daylight Time)
> new Date('2013-04-15');
Mon Apr 15 2013 01:00:00 GMT+0100 (GMT Daylight Time)

显然,一个被解释为UTC时间,而另外两个被解释为当地时间。解析的原因是什么?

3 个答案:

答案 0 :(得分:2)

来自specification

  

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

在您提供的所有格式中,只有'2013-04-15'受到官方支持,因此其他格式似乎都会依赖于与实现相关的行为。

答案 1 :(得分:2)

Date构造函数委托给Date.parseDate.parse似乎有两种变体:

  

给定一个表示时间的字符串,parse返回时间值。它   接受 RFC2822 / IETF日期语法(RFC2822第3.3节),例如   “周一,1995年12月25日格林尼治标准时间13:30:00”。它了解美国大陆   时区缩写,但对于一般用途,使用时区偏移,   例如,“Mon,25 Dec 1995 13:30:00 GMT + 0430”(4小时30分钟   格林威治子午线以东)。 如果您没有指定时区,   假设当地时区。 GMT和UTC被认为是等效的。

     

或者,日期/时间字符串可以在    ISO 8601格式。从JavaScript 1.8.5(Firefox 4)开始,一个子集   支持ISO 8601。例如,“2011-10-10”(仅限日期)或   “2011-10-10T14:48:00(日期和时间)可以传递和解析。

显然,这些在本地时区的行为方式不同


修改:看起来这是implementation defined

答案 2 :(得分:2)

您的第三个示例是唯一一个实际由规范解释的示例。当您使用单个参数调用Date构造函数时,this is what happens(其中v是传递给构造函数的字符串):

  

v解析为日期,方式与parse方法完全相同(15.9.4.2);让V为此日期的时间值。

parse method将尝试解析字符串(强调添加):

  

字符串可以解释为本地时间,UTC时间或某个其他时区的时间,具体取决于字符串的内容。该函数首先尝试根据日期时间字符串格式(15.9.1.15)中调出的规则解析String的格式。

     

如果字符串不符合该格式,则该函数可能会回退到任何特定于实现的启发式或特定于实现的日期格式

Date Time String Format”是YYYY-MM-DDTHH:mm:ss.sssZ,还定义了YYYY-MM-DD形式的缩写版本,这是您在第三个示例中使用的版本。

对于其他示例,解析将失败,并且行为是实现定义的。

相关问题