Метод 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 2822options — объект дополнительных параметров
(используется редко, но может включать настройки локали и строгого
режима)Возвращаемое значение — объект DateTime. Если строка
некорректна, возвращается объект с состоянием invalid.
Типичная строка включает следующие компоненты:
Пример:
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-формату с учётом временного смещения.
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);
}
Частые причины невалидности:
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")
При этом:
Результат 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 остаётся актуальным в следующих областях:
Luxon обеспечивает совместимость с этими источниками без необходимости ручного разбора строки.