2012-12-01 42 views
1

有人可以解釋我輸出http://jsfiddle.net/mark69_fnd/NhuLe/產生?JavaScript的日期是如何工作的?

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) 

我有興趣瞭解它如何決定計算一天。請注意0​​,2012-08-92013-08-09之間的差異。

我在Chrome上運行它。

回答

4

這是一個非常有趣,微妙的問題。

原因是你的一些日期是在規範中定義的類似ISO-8601的格式,所以被解析爲GMT,但其他人是而不是,所以他們回落到非標準日期解析,這似乎是(在Chrome中)使用本地時間來代替。

的日期字符串2012-07-01符合在Section 15.9.1.15指定的格式,所以根據該部分的規則,它在時區Z(GMT)進行解析。然後輸出它,並且它在本地時間輸出,大約在四個小時之前,所以日期會隨着原始值(沒有時間部分)在午夜時改變。

日期字符串2012-08-1符合上面的格式(它需要的10)。這使我們離開了具體行爲的領域。的Date構造函數,給定的字符串的情況下,遵循相同的規則Date.parse,這是在Section 15.9.4.2定義,它說除其他事項:

的函數首先嚐試根據所謂的規則解析所述字符串的格式日期時間字符串格式(15.9.1.15)。 如果字符串不符合該格式,該函數可能會回退到任何特定於實現的啓發式或實現特定的日期格式。

(我的重點)

這個故事的寓意是:堅持以指定格式。 :-)

但是一個方面的說明:規範中定義的日期/時間格式相對較新(大約三年前的ES5)。在此之前,需要解析Date構造函數(或Date解析)的定義的日期/時間格式。它必須能夠解析任何Date#toString吐出,但那是什麼是實現特定的。而舊版瀏覽器確實無法解析2012-08-01。雖然沒有指定,但幾乎所有的瀏覽器(我曾經測試過的每一個瀏覽器)解析2012/08/01,但。當然,現在我想回頭看看他們使用的是什麼時區(並檢查他們是否都使用同一個時區)...

+1

多麼牛...... – mark

+0

@mark:是的。 JavaScript的日期不是很好。它曾經更糟糕(看我的編輯),但它仍然有一個方法去... :-) –

+0

有沒有一個圖書館,使日期一個理智的企業工作?我看到很多datejs的引用,但它是5年前最後更新的,所以我不確定它是否仍然很好。 – mark

0

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

但是,當它顯示您的瀏覽器時區(在您的情況下爲GMT -400)的日期相同。

那就是你看到所有時機爲20:00的原因。

+0

我認爲這是GMT時區的事情,但你怎麼樣解釋'new Date('2012-08-1')== Wed Aug 01 2012 00:00:00 GMT-0400(Eastern Daylight Time)'?這不應該在7月31日結束嗎? –

+0

@ T.J.Crowder - 正好。 – mark

+0

新日期('2013-04-09')==星期二Apr 09 2013 01:00:00 GMT + 0100(BST) 新日期('2013-04-9')==星期二Apr 09 2013 00: 00:00 GMT + 0100(BST) 爲什麼上面的第一個例子中增加了額外的小時?這有點令人困惑:/ – robertp