2013-07-26 37 views
1

當我從字符串構造一個日期對象時,我得到了令人困惑的結果。如果我沒有指定時間,似乎時間是任意選擇的(但可重複)。Javascript日期構造函數使用任意時間

var d1=new Date("2013-10-9"), d2=new Date("2013-10-10"); 
output = d1+' '+d1.toUTCString()+'<br>\n'; 
output += d2+' '+d2.toUTCString()+'<br>\n'; 

鉻20.0 ...

Wed Oct 09 2013 00:00:00 GMT-0600 (MDT) Wed, 09 Oct 2013 06:00:00 GMT 
Wed Oct 09 2013 18:00:00 GMT-0600 (MDT) Thu, 10 Oct 2013 00:00:00 GMT 

爲什麼會選擇鉻不同的時間10月10日?

順便說,解決辦法是在這裏:https://stackoverflow.com/a/744134/86967

+0

Dup'ed發現:http://stackoverflow.com/q/43060107/86967 – nobar

回答

2

就好像你正在使用的日期字符串格式做。如果您指定2013-10-09(當天通知額外的0),那麼它按預期工作。如果您在日期和月份使用2位數字,則您遵循ECMA規範。

var d1=new Date("2013-10-09"), d2=new Date("2013-10-10"); 
console.log(d1+' '+d1.toUTCString()); 
console.log(d2+' '+d2.toUTCString()); 

產量:

Tue Oct 08 2013 20:00:00 GMT-0400 (Eastern Daylight Time) Wed, 09 Oct 2013 00:00:00 GMT 
Wed Oct 09 2013 20:00:00 GMT-0400 (Eastern Daylight Time) Thu, 10 Oct 2013 00:00:00 GMT 

我相信他們正在使用的代碼可以在這裏找到:

https://github.com/WebKit/webkit/blob/master/Source/WTF/wtf/DateMath.cpp

當你提供一個ECMA日期,它會使用parseES5DateFromNullTerminatedCharacters方法來解析日期,但是當你如果是非標準日期格式,它將使用parseDateFromNullTerminatedCharacters方法。我不太熟悉webkit代碼,所以我可能會錯,但是這是基於我對解析邏輯的閱讀。

標準的日期格式可以在部分15.9.1.15 of the ECMA Spec.

+0

如果使用ISO標準,它選擇午夜GMT - 否則,它選擇當地時間午夜?這似乎是這種情況,但我不明白爲什麼。從十月,十一月和十二月的第十天開始,格式會自動修復。 – nobar

+1

由於您在十月份之前的幾個月內遵循ISO標準YYYY-MM-DD,所以格式可以自行修復,您可能只在本月使用一位數字(即2013-9-10)。當你在每個月的十分之一點擊兩位數字,並且在每個月的十分之一之後創建一個日期時,您現在已經符合ISO標準,並且在這些日期中使用了不同的解析邏輯。 –

+0

這就是我的意思 - 我只是想指出同樣的事情。看起來很奇怪的是,如果零被排除,那麼Javascript會有不同的解釋,因爲在2013-12-31這樣的日子裏沒有辦法排除零。 – nobar