ECMAScript 5 Date.parse ISO 8601测试用例的结果 [英] ECMAScript 5 Date.parse results for ISO 8601 test cases

查看:110
本文介绍了ECMAScript 5 Date.parse ISO 8601测试用例的结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于以下测试用例,哪些结果是正确的?

  // 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆