ECMAScript 5 Date.parse Results for ISO 8601 Tests

Which result is suitable for the following test cases?

//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 seems to be more specific for edge cases; currently says that invalid date formats are implementation dependent, right?

+3
source share
1 answer

According to the ES5 specification, Date.parse will only work with a valid ISO 8601 . Everything else depends on the implementation (in practice IE <9 does not work with standard ISO dates, this requires a "/" seperator). Therefore, if you submit an invalid date (e.g. 2012-11-31), you can get anythying from 2012-12-01 until the error.

In your tests:

 2012-12-31T23:59:60.000Z 

should work, although probably not the way you expect. Using 60 seconds shows a second jump, this is not equivalent to 24:00:00, only Safari seems to be getting this right.

also:

 2012-04-04T24:00:00.000Z 

should work, it shows midnight at the end of April 4, 2012, so Firefox is mistaken there.

Formats that must be supported by ES5 implementations are in spec .

Oh, and you probably should also check for the lack of a “T” (since in some cases this, in my opinion, includes additional browsers) and different time zones, such as:

 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 

etc. with the formats YYYYDDD and YYYYWWD, although implementation is not required to support them.

+4
source

All Articles