1. 程式人生 > >Date.parse和new Date(str)的相容性問題

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')

返回的是1388530800000!於是一想,前端組裡好像只有我是常用Chrome的,其他人都是Firefox,難道是相容性的問題?

於是換瀏覽器使勁測了測,果然如此。在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. 正確的做法

  1. var time1 = (timestart+' 00:00:00').toString();  
  2. var time2 = (timeend+' 23:59:59').toString();  
  3. timestart = new Date(Date.parse(str.replace(/-/g,"/"))).getTime();  
  4. timeend = new Date(Date.parse(str.replace(/-/g,"/"))).getTime();  
  主要的變化是對預設的日期格式進行了轉換, 基於'/'格式的日期字串,才是被各個瀏覽器所廣泛支援的,‘-’連線的日期字串,則是隻在chrome下可以正常工作。

2. 知識點總結

   '2015-05-04'是無法被各個瀏覽器中,使用new Date(str)來正確生成日期物件的。 正確的用法是'2015/05/05'.