2013-02-20 59 views
6

这是怎么回事:为什么JavaScript的解释这些相同的日期不同

> 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时间,而其他两个被解释为本地时间。什么导致解析中的差异?

回答

2

specification

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

您所提供的所有格式中,只有'2013-04-15'被正式支持,所以其他人似乎回落到实现相关的行为。

+0

那么我从MDN文档中引用的部分是由什么组成的? – Eric 2013-02-20 09:59:33

+1

您从MDN引用的部分可能会详述Gecko实施行为(因为正如规范所示,此情况由实施决定)。 – 2013-02-20 10:00:38

+1

@Eric:它可以是Firefox的实现细节,也可以是非官方的,但广泛支持的功能。 Chrome浏览器似乎行为相同,所以它可能是后者。 – 2013-02-20 10:01:12

2

Date构造委托给Date.parse,并且看起来Date.parse有两个变种:

给定一个表示时间的字符串,解析返回的时间价值。它接受RFC2822/IETF日期语法(RFC2822第3.3节),例如, “星期一,1995年12月25日13:30:00 GMT”。它了解大陆US 时区缩写,但对于一般用途,请使用时区偏移量,例如,“星期一,1995年12月25日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

你的第三个例子是,实际上是在规范中解释只有一个当你调用Date构造带一个参数,this is what happens(其中v是传递给构造的字符串):为一个日期

解析v,以完全相同的方式作为用于parse方法(15.9.4.2);让V为该日期的时间值。

parse method将试图解析字符串(强调):

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

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

与“Date Time String Format”是YYYY-MM-DDTHH:mm:ss.sssZ,并且还定义形式YYYY-MM-DD,这是你在你的第三个例子使用的更短的版本。

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

相关问题