JavaScript的日期是如何工作的?

JavaScript的日期是如何工作的?,javascript,date,Javascript,Date,有人能给我解释一下输出结果吗 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 (Easter

有人能给我解释一下输出结果吗

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-9和2013-08-09之间的差异

我在Chrome上运行了它。

新日期“2012-07-01”表示您提供的日期为*GMT 000*0时区

但是,当它向您显示日期时,它在您的浏览器时区中也会显示相同的日期,您的浏览器时区是GMT-400

这就是您将所有计时设置为20:00的原因。

新日期“2012-07-01”表示您提供的日期为*GMT 000*0时区

但是,当它向您显示日期时,它在您的浏览器时区中也会显示相同的日期,您的浏览器时区是GMT-400


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

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

原因是,您的一些日期采用规范中定义的类似ISO-8601的格式,因此被解析为GMT,而其他日期则不是,因此它们采用非标准日期解析,而Chrome似乎使用本地时间

日期字符串2012-07-01符合中指定的格式,因此根据该节的规则,它将在时区Z GMT中解析。然后您输出它,并在本地时间(大约四小时之前)输出,因此日期将更改,因为没有时间部分的原始值为午夜

日期字符串2012-08-1不符合该格式,它需要在1之前加0。这让我们走出了特定行为的领域。给定字符串时,日期构造函数遵循与中定义的Date.parse相同的规则,其中包括:

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

我的重点

这个故事的寓意是:坚持特定的格式-


但有一点值得注意:从大约三年前的ES5开始,规范中定义的日期/时间格式相对较新。在此之前,没有定义日期构造函数或日期解析需要解析的日期/时间格式。它只需要能够解析DatetoString吐出的任何数据,但这是特定于实现的。而较旧的浏览器确实无法解析2012-08-01。尽管没有指定,但几乎所有我测试过的浏览器都会解析2012/08/01。当然,现在我想回去看看他们使用的时区,看看他们是否都使用相同的时区…

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

原因是,您的一些日期采用规范中定义的类似ISO-8601的格式,因此被解析为GMT,而其他日期则不是,因此它们采用非标准日期解析,而Chrome似乎使用本地时间

日期字符串2012-07-01符合中指定的格式,因此根据该节的规则,它将在时区Z GMT中解析。然后您输出它,并在本地时间(大约四小时之前)输出,因此日期将更改,因为没有时间部分的原始值为午夜

日期字符串2012-08-1不符合该格式,它需要在1之前加0。这让我们走出了特定行为的领域。给定字符串时,日期构造函数遵循与中定义的Date.parse相同的规则,其中包括:

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

我的重点

这个故事的寓意是:坚持特定的格式-


但有一点值得注意:从大约三年前的ES5开始,规范中定义的日期/时间格式相对较新。在此之前,没有定义日期构造函数或日期解析需要解析的日期/时间格式。它只需要能够解析DatetoString吐出的任何数据,但这是特定于实现的。而较旧的浏览器确实无法解析2012-08-01。尽管没有指定,但几乎所有我测试过的浏览器都会解析2012/08/01。当然,现在我想回去看看他们使用的时区,并检查他们是否都使用相同的时区…

我还以为这是GMT与时区的对比,但你如何解释新的日期'2012-08-1'==Wed Aug 01 2012 00:00:00 GMT-0400东部夏令时?这不应该也在7月31日结束吗?新日期'2013-04-09'==2013年4月9日星期二01:00:00 GMT+0100 BST新日期'2013-04-9'==2013年4月9日星期二00:00:00 GMT+0100 BST,为什么这是第一个示例
爱情有额外的一小时吗?这有点让人困惑:/我还以为这是GMT和时区的事情,但你如何解释新的日期'2012-08-1'==Wed Aug 01 2012 00:00:00 GMT-0400东部夏令时?这不应该也在7月31日结束吗?新的日期'2013-04-09'==2013年4月9日星期二01:00:00 GMT+0100 BST新的日期'2013-04-9'==2013年4月9日星期二00:00:00 GMT+0100 BST,为什么上面的第一个例子增加了一个小时?这有点让人困惑:/@马克:是的。JavaScript的约会内容并不好。以前更糟的是看我的编辑,但还有一段路要走…:-有没有一个图书馆能让约会成为一件明智的事情?我看到很多对datejs的引用,但它最近一次更新是在5年前,所以我不确定它是否仍然好。@马克:是的,datejs很遗憾已经过时了呃,对不起,这不是故意的,在午夜解析日期时有错误。有一个,看起来不错,虽然我没有广泛使用。@mark:是的。JavaScript的约会内容并不好。以前更糟的是看我的编辑,但还有一段路要走…:-有没有一个图书馆能让约会成为一件明智的事情?我看到很多对datejs的引用,但它最近一次更新是在5年前,所以我不确定它是否仍然好。@马克:是的,datejs很遗憾已经过时了呃,对不起,这不是故意的,在午夜解析日期时有错误。有一个,看起来不错,虽然我没有广泛使用。