ECMAScript 5 Date.parse ISO 8601测试用例的结果 [英] ECMAScript 5 Date.parse results for ISO 8601 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:00Z)); // 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-1 2-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
//扩展年:
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
控制台.log(Date.parse(+ 275760-09-13T00:00:00.001Z)); // NaN NaN NaN 8.64e15 + 1 8.64e15 + 1
conol e.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
console.log(Date.parse(2034-03-01T00:00:00.000Z) -
Date.parse(2034-02-27T23:59:59.999Z)); // 86400001 86400001 86400001 86400001 1
//时区偏移
console.log(日期。解析(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应该更边缘的情况;目前是说无效的日期格式是依赖于实现的,我是对的吗?
根据ES5规范, Date.parse 只能使用有效的 ISO 8601 日期。任何其他都是依赖于实现的(实际上IE< 9不符合标准的ISO日期,它需要一个'/'分隔符)。所以如果你给它一个无效的日期(如2012-11-31),你可以从2012-12-01获得一个错误。
在你的测试:
2012-12-31T23:59:60.000Z
应该工作,但可能不如你所期望的。使用 60 秒表示闰秒,它不等于24:00:00,只有Safari似乎是正确的。
另外:
2012-04-04T24:00:00.000Z
pre>
应该工作,它表示2012年4月4日的午夜,所以Firefox是错误的。
ES5实现应支持的格式在规格中。
哦,你也应该考虑省略'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格式,虽然实现不需要支持他们。
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.
这篇关于ECMAScript 5 Date.parse ISO 8601测试用例的结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!