Ответ 1
TL; DR. Если вы вернетесь к новой или старой RFC 7231, то она будет анализировать большинство современных браузеров, поскольку все они имеют очень похожие и безумно гибкие правила синтаксического анализа:
new Date('Sun, 24 May 2015 05:37:13 GMT')
new Date('2015 GMT 24 05:37:13 May')
// => Sun May 24 2015 01:37:13 GMT-0400 (EDT)
Если вам нужна 100-процентная гарантия в любой совместимой реализации ECMAScript, вам нужно будет использовать код приложения для преобразования временной метки в ISO 8601 format: YYYY-MM-DDTHH:mm:ss.sssZ
Помните, что часовой пояс может меняться в зависимости от местоположения пользователя.
ECMAScript определяет только следующий формат для дат:
ECMAScript определяет формат обмена строк для основанных на дате при упрощении формата ISO 8601 Extended. Формат следующим образом:
YYYY-MM-DDTHH:mm:ss.sssZ
Источник: http://es5.github.io/#x15.9.1.15
Относительно Date.parse
:
Если строка не соответствует этому формату, функция может упасть вернуться к любой эвристике, специфичной для реализации, или конкретные форматы даты.
Источник: http://es5.github.io/#x15.9.4.2
В современных реализациях браузера применяются следующие правила:
-
month/day/year
,month-day-year
для коротких дат - Месяцы и дни могут быть 1 или 2 цифры
- Годы с двумя цифрами должны быть >= 70
- Для заданных дат год и день могут быть в любом порядке в любом месте (вы увидите, что я имею в виду где-нибудь позже):
January 1 2000
,1 January 2000
,2000 1 January
- Месяцы могут быть сокращены до трех символов (я считаю, что IE допускает два)
- JavaScript переопределит недопустимые дни недели
- Часы минут и секунд разделяются двоеточиями: '10: 20: 30', '10: 20 ', '10:' действительны
- Вы можете указать "AM" и "PM" где угодно, но если вы ошибаетесь или избыточны, вы получите
NaN
или недопустимую ошибку даты - Вы можете указать строку часового пояса (например, "EST", "EDT", "GMT" ) в любом месте
"Anywhere" действительно означает "в любом месте": вы можете смешивать дерьмо из компонентов. Следующее безумие работает, например...
new Date('PM Jan EST 2015 1 10:00')
new Date('2015 1 10:00 Jan EST PM')
// => Thu Jan 01 2015 10:00:00 GMT-0500 (EST)
... Вот почему вы почти гарантированы для этих дат для разбора.
Источники:
- V8: https://github.com/v8/v8-git-mirror/blob/master/test/mjsunit/date-parse.js
- Mozilla: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse
- WebKit: https://github.com/WebKit/webkit/blob/master/LayoutTests/js/date-parse-test-expected.txt, https://github.com/WebKit/webkit/blob/master/Source/WTF/wtf/DateMath.cpp (какое пространство имен!)
- MSDN: https://msdn.microsoft.com/library/k4w173wk%28v=vs.94%29.aspx