ECMAScript 5日期.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: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应该更具体地用于边缘情况;目前是说无效的日期格式取决于实现,对吗?
根据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
如果工作,它表示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和YYYYYWwwD格式等等,尽管不需要实现来支持它们。
相关文章:
- 你好,这是测试用例,我必须在函数中传递n个参数
- 如何为以下角度函数编写单元测试用例
- 是否有任何开源web应用程序具有良好的QUnit(或JSUnit)测试用例
- 因果报应并没有执行测试用例
- 运行茉莉花测试用例
- 如何阻止量角器在失败时运行进一步的测试用例
- 从FORM访问HTML元素的JavaScript函数的单元测试用例
- Regex单词边界(退格)测试用例
- 针对每个场景使用Jasmine测试用例
- JavaScript/jQuery-脚本不起作用-添加&删除类,合并数组-测试用例
- 你如何为 HTML 输出编写测试用例
- 如何在 eclipse 中为 angularjs 测试和创建测试用例
- Casperjs 多个测试用例
- 不同功能的摩卡测试用例
- 量角器在不使用browser.sleep的情况下编写更干净的测试用例
- 为什么jquery正则表达式每次返回不同的测试用例
- 如何在摩卡的测试用例中调用另一个测试用例
- 函数内 Restangular 的茉莉花测试用例
- 如何创建JavaScript测试用例
- 请建议如何为以下angularjs代码编写Jasmine测试用例