Метод fromRFC2822

Метод DateTime.fromRFC2822 в библиотеке Luxon предназначен для разбора строк дат, представленных в формате RFC 2822, и преобразования их в объект DateTime. Этот формат широко используется в HTTP-заголовках, email-сообщениях и устаревших интернет-протоколах.

RFC 2822 описывает дату в человекочитаемом виде, например:

Tue, 01 Nov 2023 13:45:30 +0200

Метод обеспечивает корректную интерпретацию таких строк с учётом часового пояса, дня недели и смещения относительно UTC.


Синтаксис

DateTime.fromRFC2822(text: string, options?: Object)
  • text — строка даты в формате RFC 2822
  • options — объект дополнительных параметров (используется редко, но может включать настройки локали и строгого режима)

Возвращаемое значение — объект DateTime. Если строка некорректна, возвращается объект с состоянием invalid.


Структура RFC 2822 строки

Типичная строка включает следующие компоненты:

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

Пример:

Fri, 21 Jul 2023 10:30:00 -0400

Разбор происходит следующим образом:

  • Fri — день недели (игнорируется при вычислениях, но может проверяться)
  • 21 Jul 2023 — календарная дата
  • 10:30:00 — локальное время
  • -0400 — смещение относительно UTC

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

Метод выполняет несколько этапов обработки:

1. Лексический разбор строки Luxon анализирует строку и выделяет компоненты даты и времени.

2. Интерпретация временной зоны Смещение +HHMM или -HHMM преобразуется в минутный offset.

3. Нормализация в UTC-эквивалент Внутренне дата приводится к единой временной базе.

4. Создание DateTime объекта Формируется экземпляр DateTime с установленными значениями.


Особенности работы

Игнорирование дня недели

День недели в RFC 2822 носит вспомогательный характер. Luxon может его проверить, но приоритет всегда у фактической даты.

Пример:

Mon, 02 Jan 2023 00:00:00 +0000

Если день недели не соответствует дате, результат обычно всё равно считается валидным.


Поддержка часовых смещений

Метод корректно обрабатывает различные форматы offset:

  • +0000 — UTC
  • +0300 — UTC+3
  • -0930 — UTC-9:30

Смещение всегда учитывается при вычислении внутреннего времени.


Локаль не влияет на парсинг

RFC 2822 использует английские названия месяцев и дней недели, поэтому локаль Luxon не влияет на разбор строки. Однако локаль может влиять на последующее форматирование результата.


Примеры использования

Базовый разбор строки

import { DateTime } from "luxon";

const dt = DateTime.fromRFC2822("Tue, 01 Nov 2023 13:45:30 +0200");

console.log(dt.toISO());

Результат будет приведён к ISO-формату с учётом временного смещения.


Работа с email-датацией

RFC 2822 часто встречается в email-заголовках:

Date: Wed, 15 Mar 2023 08:00:00 +0000

Разбор:

const emailDate = DateTime.fromRFC2822(
  "Wed, 15 Mar 2023 08:00:00 +0000"
);

console.log(emailDate.toLocaleString(DateTime.DATETIME_FULL));

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

const dt = DateTime.fromRFC2822("invalid date string");

if (!dt.isValid) {
  console.log(dt.invalidReason);
}

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

  • некорректный формат месяца
  • отсутствие обязательных компонентов
  • неправильное смещение

Отличия от fromHTTP и fromISO

RFC 2822 часто путают с другими форматами Luxon:

  • fromISO — работает с ISO 8601 (2023-11-01T13:45:30Z)
  • fromHTTP — алиас для RFC 1123 (HTTP-date)
  • fromRFC2822 — более старый email-ориентированный формат

Ключевое отличие заключается в наборе допустимых строк и исторической области применения.


Поведение при ошибках парсинга

Если строка не соответствует стандарту RFC 2822, Luxon возвращает объект:

DateTime.invalid("unsupported format")

При этом:

  • объект создаётся всегда
  • вычисления не выполняются
  • любые операции с таким объектом возвращают invalid-состояние

Использование в цепочках преобразований

Результат fromRFC2822 можно сразу использовать в форматировании и арифметике дат:

const dt = DateTime.fromRFC2822("Fri, 21 Jul 2023 10:30:00 -0400");

const updated = dt.plus({ days: 5 });

console.log(updated.toISO());

Практическое значение формата

RFC 2822 остаётся актуальным в следующих областях:

  • email-протоколы (SMTP, IMAP)
  • HTTP-заголовки устаревших серверов
  • логирование систем с текстовыми временными метками
  • парсинг исторических данных из веб-архивов

Luxon обеспечивает совместимость с этими источниками без необходимости ручного разбора строки.