Date.parse和new Date(str)的相容性問題
今天遇到一個怪異的BUG, 一路跟蹤到isNaN(Date.parse(str))這句上,這裡的意圖是探測str是否是合法的日期字串。根據MDN的定義:
The Date.parse() method parses a string representation of a date, and returns the number of milliseconds since January 1, 1970, 00:00:00 UTC.
只要是合法的日期字串,就會返回一個UTC日期。那麼要是不合法呢?MDN上有一個例子:
Date.parse('foo-bar 2014');// returns: NaN
這麼看來他的做法應該是可行的,但為啥出現問題了呢?我在自己的電腦上試了下,Date.parse('foo-bar 2014')
於是換瀏覽器使勁測了測,果然如此。在Firefox中,字串中只要出現非日期字母就會立即判定為非法日期字串,而在當前版本的Chrome中,只要字串最後的那部分是數字,並且和前面有空格分隔,Date.parse就會取空格和數字部分,並按這個部分給出一個日期。於是在Chrome下,Date.parse('foo-bar 2014')
與Date.parse(' 2014')
所得的結果是一致的。但如果數字前面不是空格,如'foo-bar-2014,則會同Firefox一樣返回NaN。
WebKit系核心的safari沒有這個問題,行為與Firefox一致。其他瀏覽器則還沒來得及測,有windows的朋友可以試試IE的結果。
這是我第一次遇到這樣的問題,也提醒自己儘管現代瀏覽器已經越來越標準化了,相容性的問題還是會在某些不起眼的地方出現,給你埋下一個又一個難以察覺的坑。
上一篇文章中說的就有一種方法將日期轉為毫秒數的Date.parse(),同樣測試後在移動端瀏覽器都顯示為NAN,不能正常使用,繼續探尋新的方法。 對於new Date(str); 在頁面中,我們使用了一個時間元件,但是發現在Firefox下是無法正常工作的,同樣在移動端瀏覽器也是不識別的,返回結果都是NAN,但是在Chrome下是可以正常執行的。 問題出在哪裡呢?1. 正確的做法
-
var time1 = (timestart+' 00:00:00').toString();
- var time2 = (timeend+' 23:59:59').toString();
- timestart = new Date(Date.parse(str.replace(/-/g,"/"))).getTime();
- timeend = new Date(Date.parse(str.replace(/-/g,"/"))).getTime();
2. 知識點總結
'2015-05-04'是無法被各個瀏覽器中,使用new Date(str)來正確生成日期物件的。 正確的用法是'2015/05/05'.