1

有人可以解释一下http://jsfiddle.net/mark69_fnd/NhuLe/产生的输出吗?

new Date('2012-07-01') == Sat Jun 30 2012 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-07-09') == Sun Jul 08 2012 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-07-10') == Mon Jul 09 2012 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-07-31') == Mon Jul 30 2012 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-08-1') == Wed Aug 01 2012 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-08-9') == Thu Aug 09 2012 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-08-10') == Thu Aug 09 2012 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-08-31') == Thu Aug 30 2012 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-09-1') == Sat Sep 01 2012 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-09-9') == Sun Sep 09 2012 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-09-10') == Sun Sep 09 2012 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-12-09') == Sat Dec 08 2012 19:00:00 GMT-0500 (Eastern Standard Time)
new Date('2012-12-31') == Sun Dec 30 2012 19:00:00 GMT-0500 (Eastern Standard Time)
new Date('2013-01-01') == Mon Dec 31 2012 19:00:00 GMT-0500 (Eastern Standard Time)
new Date('2013-01-09') == Tue Jan 08 2013 19:00:00 GMT-0500 (Eastern Standard Time)
new Date('2013-02-09') == Fri Feb 08 2013 19:00:00 GMT-0500 (Eastern Standard Time)
new Date('2013-03-09') == Fri Mar 08 2013 19:00:00 GMT-0500 (Eastern Standard Time)
new Date('2013-04-09') == Mon Apr 08 2013 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2013-05-09') == Wed May 08 2013 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2013-06-09') == Sat Jun 08 2013 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2013-07-09') == Mon Jul 08 2013 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2013-08-09') == Thu Aug 08 2013 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2013-09-09') == Sun Sep 08 2013 20:00:00 GMT-0400 (Eastern Daylight Time)

我有兴趣了解它如何决定计算这一天。请注意 和 之间的2012-07-09区别。2012-08-92013-08-09

我在 Chrome 上运行它。

4

2 回答 2

4

这是一个非常有趣且微妙的问题。

原因是您的某些日期采用规范中定义的类似 ISO-8601 的格式,因此被解析为 GMT,但其他日期不是,因此它们依赖于非标准日期解析,这似乎是(在 Chrome 中)改用当地时间。

日期字符串2012-07-01符合第 15.9.1.15 节中指定的格式,因此根据该节的规则,它在时区 Z (GMT) 中解析。然后你输出它,它在本地时间输出,大约提前四个小时,所以日期随着原始值(没有时间部分)在午夜发生变化。

日期字符串2012-08-1符合该格式(它需要在0之前1)。这使我们脱离了特定行为的领域。构造函数,当给定一个字符串时,遵循与第 15.9.4.2 节中定义的Date规则相同的规则,其中包括:Date.parse

该函数首先尝试根据日期时间字符串格式(15.9.1.15)中调用的规则解析字符串的格式。如果字符串不符合该格式,则函数可能会退回到任何特定于实现的启发式或特定于实现的日期格式。

(我的重点)

这个故事的寓意是:坚持指定的格式。:-)

但附带说明:规范中定义的日期/时间格式相对较新(从 ES5 开始,大约三年前)。在此之前,没有定义Date构造函数(或Date解析)需要解析的日期/时间格式。它只需要能够解析Date#toString吐出的任何内容,但那是特定于实现的。并且较旧的浏览器确实无法解析2012-08-01. 尽管没有指定,但几乎所有浏览器(我测试过的每一个)都会解析2012/08/01. 当然,现在我想回去看看他们使用的时区(并检查他们是否都使用相同的时区)......

于 2012-12-01T11:58:15.063 回答
0

new Date('2012-07-01')表示您在 * GMT 000 *0 时区提供日期。

但是,当它向您显示日期时,它会在您的浏览器时区(在您的情况下为GMT -400)中执行相同的操作。

这就是您看到所有时间都是20:00的原因。

于 2012-12-01T11:51:23.660 回答