JavaScript的日期如何工作?

时间:2012-12-01 11:48:31

标签: javascript date

有人可以解释输出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-092012-08-92013-08-09之间的区别。

我在Chrome上运行它。

2 个答案:

答案 0 :(得分:4)

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

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

日期字符串2012-07-01符合Section 15.9.1.15中指定的格式,因此根据该部分的规则,它在时区Z(GMT)中进行解析。然后你输出它,并在当地时间输出,提前四个小时左右,因此日期随着原始值(没有时间部分)在午夜而变化。

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

  

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

(我的重点)

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

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

答案 1 :(得分:0)

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

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

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

相关问题