2012-04-04 68 views
3

什麼結果適用於以下測試用例?ECMAScript 5 ISO 8601測試用例的Date.parse結果

            //Chrome 19  Opera 12  Firefox 11 IE 9   Safari 5.1.1 
console.log(Date.parse("2012-11-31T23:59:59.000Z"));//1354406399000 NaN   NaN   1354406399000 NaN 
console.log(Date.parse("2012-12-31T23:59:59.000Z"));//1356998399000 1356998399000 1356998399000 1356998399000 1356998399000 
console.log(Date.parse("2012-12-31T23:59:60.000Z"));//NaN   NaN   NaN   NaN   1356998400000 
console.log(Date.parse("2012-04-04T05:02:02.170Z"));//1333515722170 1333515722170 1333515722170 1333515722170 1333515722170 
console.log(Date.parse("2012-04-04T24:00:00.000Z"));//NaN   1333584000000 1333584000000 1333584000000 1333584000000 
console.log(Date.parse("2012-04-04T24:00:00.500Z"));//NaN   NaN   1333584000500 1333584000500 NaN 
console.log(Date.parse("2012-12-31T10:08:60.000Z"));//NaN   NaN   NaN   NaN   1356948540000 
console.log(Date.parse("2012-13-01T12:00:00.000Z"));//NaN   NaN   NaN   NaN   NaN 
console.log(Date.parse("2012-12-32T12:00:00.000Z"));//NaN   NaN   NaN   NaN   NaN 
console.log(Date.parse("2012-12-31T25:00:00.000Z"));//NaN   NaN   NaN   NaN   NaN 
console.log(Date.parse("2012-12-31T24:01:00.000Z"));//NaN   NaN   NaN   1356998460000 NaN 
console.log(Date.parse("2012-12-31T12:60:00.000Z"));//NaN   NaN   NaN   NaN   NaN 
console.log(Date.parse("2012-12-31T12:00:60.000Z"));//NaN   NaN   NaN   NaN   1356955260000 
console.log(Date.parse("2012-00-31T23:59:59.000Z"));//NaN   NaN   NaN   NaN   NaN 
console.log(Date.parse("2012-12-00T23:59:59.000Z"));//NaN   NaN   NaN   NaN   NaN 
console.log(Date.parse("2012-02-29T12:00:00.000Z"));//1330516800000 1330516800000 1330516800000 1330516800000 1330516800000 
console.log(Date.parse("2011-02-29T12:00:00.000Z"));//1298980800000 NaN   NaN   1298980800000 NaN 
console.log(Date.parse("2011-03-01T12:00:00.000Z"));//1298980800000 1298980800000 1298980800000 1298980800000 1298980800000 

// extended years: 
console.log(Date.parse("0000-01-01T00:00:00.000Z"));//-621672192e5 -621672192e5 -621672192e5 -621672192e5 -621672192e5 
console.log(Date.parse("+275760-09-13T00:00:00.000Z"));//8.64e15 NaN   8.64e15  8.64e15  8.64e15 
console.log(Date.parse("-271821-04-20T00:00:00.000Z"));//-8.64e15 NaN   -8.64e15  -8.64e15  -8.6400000864e15 
console.log(Date.parse("+275760-09-13T00:00:00.001Z"));//NaN  NaN   NaN   8.64e15 + 1 8.64e15 + 1 
console.log(Date.parse("-271821-04-19T23:59:59.999Z"));//NaN  NaN   NaN   -8.64e15 - 1 -8.6400000864e15 - 1 

// https://github.com/kriskowal/es5-shim/issues/80 Safari bug with leap day 
console.log(Date.parse("2034-03-01T00:00:00.000Z") - 
      Date.parse("2034-02-27T23:59:59.999Z"));//86400001  86400001  86400001  86400001  1 

// Time Zone Offset 
console.log(Date.parse("2012-01-29T12:00:00.000+01:00"));//132783480e4 132783480e4 132783480e4 132783480e4 132783480e4 
console.log(Date.parse("2012-01-29T12:00:00.000-00:00"));//132783840e4 132783840e4 132783840e4 132783840e4 132783840e4 
console.log(Date.parse("2012-01-29T12:00:00.000+00:00"));//132783840e4 132783840e4 132783840e4 132783840e4 132783840e4 
console.log(Date.parse("2012-01-29T12:00:00.000+23:59"));//132775206e4 132775206e4 132775206e4 132775206e4 132775206e4 
console.log(Date.parse("2012-01-29T12:00:00.000-23:59"));//132792474e4 132792474e4 132792474e4 132792474e4 132792474e4 
console.log(Date.parse("2012-01-29T12:00:00.000+24:00"));//NaN   1327752e6 NaN   1327752000000 1327752000000 
console.log(Date.parse("2012-01-29T12:00:00.000+24:01"));//NaN   NaN   NaN   1327751940000 1327751940000 
console.log(Date.parse("2012-01-29T12:00:00.000+24:59"));//NaN   NaN   NaN   1327748460000 1327748460000 
console.log(Date.parse("2012-01-29T12:00:00.000+25:00"));//NaN   NaN   NaN   NaN   NaN 
console.log(Date.parse("2012-01-29T12:00:00.000+00:60"));//NaN   NaN   NaN   NaN   NaN 
console.log(Date.parse("-271821-04-20T00:00:00.000+00:01"));//NaN  NaN   NaN   -864000000006e4 -864000008646e4 
console.log(Date.parse("-271821-04-20T00:01:00.000+00:01"));//-8.64e15 NaN   -8.64e15  -8.64e15  -864000008640e4 

似乎ECMAScript應該更具體的邊緣案例;目前是說,無效的日期格式是依賴於實現的,我說得對嗎?

回答

4

根據ES5規範,Date.parse只能與有效的ISO 8601日期一起使用。除此之外的任何事情都依賴於實現(實際上,IE < 9不支持標準的ISO日期,它需要一個'/'分隔符)。所以如果你給它一個無效的日期(比如2012-11-31),你可以從2012-12-01得到任何錯誤信息。

在你的測試:

2012-12-31T23:59:60.000Z 

應該工作,雖然可能並不像你期望的那樣。對於秒來說,使用表示閏秒,它不等於24:00:00,只有Safari似乎得到了正確的結果。

另外:

2012-04-04T24:00:00.000Z 

應該工作,表示午夜2012 4月4日,結束這樣的Firefox中的錯誤。

ES5實現應支持的格式位於spec

哦,你應該還考了「T」(因爲它是在某些情況下,我認爲包括瀏覽器可選)以及不同的時區,如遺漏:

2012-04-03 23:50:00+10:00 
2012-04-03 23:50:00-04:15 
2012-04-03 23:50:00+10 
20120403T235000+1000 

等與YYYYDDD和YYYYWwwD格式,但不需要實現來支持它們。

+0

看來,ES5應該針對無效日期更具體 – 4esn0k 2012-04-04 06:02:09

+0

https://gist.github.com/2312309 – 4esn0k 2012-04-05 16:28:50

+0

@ 4esn0k - 這取決於您稱爲無效日期。 'new Date(2012,1,30)'的結果等同於2012-02-30,並導致2012年3月1日的日期對象。'Date.parse('2012-02-30')'do一樣?這是我建議手動解析日期的一個原因 - 這是確切知道如何在所有瀏覽器中處理它們的唯一方法。另一個原因是所使用的瀏覽器與ES5的最低要求不一致,所以即使有效的ISO8601日期字符串也不安全。 – RobG 2012-04-06 11:27:43