What result is right 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
Seems that ECMAScript should be more specific for edge cases; currently is says that invalid date formats are implementation dependent, am I right?
According to the ES5 spec, Date.parse will only work with valid ISO 8601 dates. Anything else is implementation dependent (in practice, IE < 9 doesn't work with standard ISO dates, it requires a '/' seperator). So if you feed it an invalid date (such as 2012-11-31) you can get anythying, from 2012-12-01 to an error.
In your tests:
2012-12-31T23:59:60.000Z
should work, though probably not as you expect. Using 60 for seconds indicates a leap second, it isn't equivalent to 24:00:00, only Safari seems to get that right.
Also:
2012-04-04T24:00:00.000Z
should work, it indicates midnight at the end of 4 April, 2012 so Firefox is in error there.
The formats that ES5 implementations should support are in the spec.
Oh, and you should probably also test omission of the 'T' (since it is optional in certain cases that I think include 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
and so on with YYYYDDD and YYYYWwwD formats, though implementations aren't required to support them.
new Date(2012,1,30)
is equivalent to 2012-02-30 and results in a date object for 1 March, 2012. Should Date.parse('2012-02-30')
do the same? That's one reason I suggest manually parsing dates—it's the only way to know exactly how they will be handled in all browsers. Another is that browsers in use aren't consistent with the minimal requirements of ES5, so even valid ISO8601 date strings aren't safe - RobG 2012-04-06 11:27