2017-03-07 78 views
0

任何人都可以用短劃線日期解釋以下行爲嗎?Javascript上有趣的怪癖

console.log(new Date('2015/03/03')); 
Tue Mar 03 2015 00:00:00 GMT+0000 (GMT Standard Time) 

console.log(new Date('2015-03-03')); 
Tue Mar 03 2015 00:00:00 GMT+0000 (GMT Standard Time) 

console.log(new Date('2015/04/03')); 
Fri Apr 03 2015 00:00:00 GMT+0100 (GMT Daylight Time) 

console.log(new Date('2015-04-03')); 
Fri Apr 03 2015 01:00:00 GMT+0100 (GMT Daylight Time) // This is the weird one 

注意:我在英國,所以冬天的GMT + 0,夏天的GMT + 1。注意2:我讀過我應該使用'/'作爲分隔符,特別是IE11不這樣做,但我想知道在Chrome中會發生什麼?

注意3:在NodeJS中它變得更加怪異。

console.log(new Date('2015/03/03')); 
2015-03-03T00:00:00.000Z 

console.log(new Date('2015-03-03')); 
2015-03-03T00:00:00.000Z 

console.log(new Date('2015/04/03')); 
2015-04-02T23:00:00.000Z //This is the weird one this time 

console.log(new Date('2015-04-03')); 
2015-04-03T00:00:00.000Z 
+0

8601是一個真實路徑。 [相關xkcd](https://xkcd.com/1179/) – cloudworks

+0

@cloudworks ... ECMAScript沒有完全遵循。 :( –

+0

謝謝。重複鏈接是真正相關的答案。 – Chexpir

回答

3

看來奇怪,這是因爲一些日期被解釋爲部分ISO日期(那些破折號),他們得到的解釋爲UTC,和其他奇蹟般地被解析並得到解釋爲本地時區。

這就是爲什麼我總是建議使用Moment日期解析與總是提供你明確地預期,並始終使用true作爲第三個參數moment()嚴格驗證,以避免任何可能的誤解,因爲把錯誤的數據格式的數據庫比崩潰更糟糕,並且日期在許多地方可能是至關重要的。

例子:

console.log(moment('2015/03/03', 'YYYY/MM/DD', true).toISOString()); 
2015-03-02T23:00:00.000Z 

console.log(moment('2015-03-03', 'YYYY-MM-DD', true).toISOString()); 
2015-03-02T23:00:00.000Z 

console.log(moment('2015/04/03', 'YYYY/MM/DD', true).toISOString()); 
2015-04-02T22:00:00.000Z 

console.log(moment('2015-04-03', 'YYYY-MM-DD', true).toISOString()); 
2015-04-02T22:00:00.000Z 

正如你所看到的,這裏沒有驚喜。

有關如何與爲什麼驗證日期,看到這個答案的詳細信息: