Как безопасно анализировать HTTP-заголовок Date в javascript

Если я использую Date.parse(), могу ли я "почти гарантировать" возможность анализировать, что происходит в моей программе?

В запись Mozilla для Date.parse, они пишут:

Для строки, представляющей время, parse() возвращает значение времени. Он принимает RFC2822/синтаксис даты IETF (RFC2822, раздел 3.3), например. "Пн, 25 декабря 1995 года 13:30:00 GMT".

Мой собственный сервер возвращает Sun, 24 May 2015 05:37:13 GMT.

Проблема в том, Википедия сообщает мне, что заголовок Date следует за RFC 7131. Теперь RFC 7231, и хотя они, кажется, говорят одно и то же (хотя 7231 является более широким), мне было интересно...

Если я использую Date.parse(), могу ли я "почти гарантировать" возможность разбирать то, что приходит в моей программе? Я рад предположить, что сервер не работает во временном вакууме.

Ответ 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)

... Вот почему вы почти гарантированы для этих дат для разбора.

Источники: