6

这里发生了什么:

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

4

3 回答 3

2

规范

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

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

于 2013-02-20T09:55:48.947 回答
2

构造Date函数委托给Date.parse,它似乎Date.parse有两个变体:

给定一个表示时间的字符串,parse 返回时间值。它接受RFC2822 / IETF 日期语法(RFC2822 第 3.3 节),例如“Mon, 25 Dec 1995 13:30:00 GMT”。它理解美国大陆时区的缩写,但对于一般用途,使用时区偏移量,例如“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”(日期和时间)可以传递和解析。

显然,这些在本地时区方面表现不同


编辑:看起来这是实现定义的

于 2013-02-20T09:55:48.773 回答
2

您的第三个示例是规范中唯一实际解释的示例。当您Date使用单个参数调用构造函数时,会发生这种情况v传递给构造函数的字符串在哪里):

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

parse方法将尝试解析字符串(添加了重点):

根据 String 的内容,String 可能被解释为本地时间、UTC 时间或其他时区的时间。该函数首先尝试根据日期时间字符串格式(15.9.1.15)中调用的规则解析字符串的格式。

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

并且“日期时间字符串格式”是YYYY-MM-DDTHH:mm:ss.sssZ,并且还定义了表单的较短版本YYYY-MM-DD,这是您在第三个示例中使用的。

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

于 2013-02-20T09:56:01.710 回答