Метод fromHTTP

Метод DateTime.fromHTTP в Luxon предназначен для разбора HTTP-даты, используемой в заголовках протокола HTTP. Он преобразует строку в формате HTTP-date (RFC 7231) в объект DateTime, учитывая особенности временной зоны и стандартов представления времени в веб-протоколах.


Сигнатура метода

DateTime.fromHTTP(text, options?)

Назначение и область применения

HTTP-даты применяются в заголовках HTTP-ответов и запросов, таких как:

  • Date
  • Expires
  • Last-Modified
  • If-Modified-Since

Метод обеспечивает корректный парсинг этих значений в объект Luxon с сохранением точного момента времени.

Ключевая особенность HTTP-формата — фиксированное представление времени в GMT (UTC), независимо от локальной временной зоны клиента или сервера.


Поддерживаемый формат HTTP-date

HTTP-date соответствует RFC 7231 и всегда выражается в GMT:

Sun, 06 Nov 1994 08:49:37 GMT

Структура:

  • день недели (сокращённо)
  • день месяца (две цифры)
  • месяц (сокращённо на английском)
  • год (четыре цифры)
  • время (HH:mm:ss)
  • обязательный суффикс GMT

Поведение метода

DateTime.fromHTTP:

  • интерпретирует входную строку как момент времени в UTC
  • возвращает объект DateTime, нормализованный к внутреннему представлению Luxon
  • автоматически валидирует формат строки
  • возвращает невалидный DateTime, если строка не соответствует стандарту

Базовое использование

import { DateTime } from "luxon";

const dt = DateTime.fromHTTP("Sun, 06 Nov 1994 08:49:37 GMT");

dt.toISO();
// "1994-11-06T08:49:37.000Z"

Особенности парсинга

HTTP-формат жёстко регламентирован, поэтому метод не допускает вариаций:

  • месяц должен быть английским сокращением (Jan, Feb, Mar и т.д.)
  • часовой пояс обязан быть строго GMT
  • разделители и порядок компонентов фиксированы

Любое отклонение приводит к невалидному результату:

const invalid = DateTime.fromHTTP("06 Nov 1994 08:49:37 GMT");

invalid.isValid; // false

Работа с временной зоной

Несмотря на указание GMT, Luxon внутренне хранит время в UTC-подобном формате. Полученный DateTime:

  • не зависит от локальной временной зоны системы
  • корректно конвертируется в любую зону через setZone
const dt = DateTime.fromHTTP("Sun, 06 Nov 1994 08:49:37 GMT");

dt.setZone("Europe/Moscow").toString();
// время будет автоматически пересчитано в +03:00 (или актуальный оффсет)

Проверка валидности

Любой результат следует проверять через isValid:

const dt = DateTime.fromHTTP("invalid string");

dt.isValid; // false
dt.invalidReason; // "unparsable"

Это важно при обработке HTTP-заголовков, где значение может отсутствовать или быть некорректным.


Сравнение с DateTime.fromRFC2822

Оба метода разбирают строковые даты, но предназначены для разных стандартов:

Метод Формат
fromHTTP HTTP-date (RFC 7231)
fromRFC2822 RFC 2822 (email/Date headers)

Пример различий:

DateTime.fromHTTP("Sun, 06 Nov 1994 08:49:37 GMT");

DateTime.fromRFC2822("Sun, 06 Nov 1994 08:49:37 +0000");

Главное отличие — строго фиксированный GMT против произвольного смещения времени.


Использование в кэшировании и HTTP-логике

Метод часто применяется при работе с:

  • кэш-заголовками (Expires, Last-Modified)
  • условными запросами (If-Modified-Since)
  • проверкой актуальности ресурса

Пример сравнения времени:

const lastModified = DateTime.fromHTTP("Sun, 06 Nov 1994 08:49:37 GMT");
const now = DateTime.utc();

const isStale = lastModified < now.minus({ days: 30 });

Поведение при некорректных данных

Если строка не соответствует формату:

  • возвращается DateTime с isValid = false
  • ошибки не выбрасываются автоматически
  • причину можно получить через invalidReason и invalidExplanation
const dt = DateTime.fromHTTP("06-11-1994");

dt.isValid; // false
dt.invalidReason; // "unparsable"

Влияние локали

HTTP-даты всегда англоязычны и не зависят от локали системы или настроек Intl. Любые локальные различия игнорируются, так как формат стандартизирован на уровне протокола.


Преобразования после парсинга

После получения объекта DateTime доступны стандартные операции Luxon:

const dt = DateTime.fromHTTP("Sun, 06 Nov 1994 08:49:37 GMT");

dt.plus({ hours: 2 }).toUTC().toISO();
// "1994-11-06T10:49:37.000Z"

Любые операции выполняются уже над нормализованным моментом времени.


Типичные сценарии ошибок

Частые причины невалидного результата:

  • отсутствие GMT
  • неправильный порядок компонентов
  • отсутствие запятых или пробелов
  • использование числового месяца вместо текстового
  • локализованные названия дней недели или месяцев

Внутреннее представление

После парсинга Luxon переводит HTTP-дату в:

  • Unix timestamp (миллисекунды)
  • внутреннюю структуру DateTime
  • фиксированную временную точку без локального смещения

Это позволяет безопасно использовать значение в арифметике дат и сравнении.