ECMAScript 5 Дата.результаты разбора тестов по стандарту 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: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 должен быть более специфичным для крайних случаев; в настоящее время is говорит, что недопустимые форматы дат зависят от реализации, я прав?

1 3

1 ответ:

Согласно спецификации ES5, Дата.разбираем будет работать только с действительными ИСО 8601 времени. Все остальное зависит от реализации (на практике IE

В ваших тестах:

2012-12-31T23:59:60.000Z

Должно сработать, хотя, вероятно, не так, как вы ожидаете. Использование 60 на секунды указывает скачкообразная секунда, она это не эквивалентно 24: 00: 00, только Safari, кажется, понимает это правильно.

Также:

2012-04-04T24:00:00.000Z

Должен работать, он указывает полночь в конце 4 апреля 2012 года, так что 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 форматы, хотя реализация не требуется для их поддержки.