Работа с формами в Luxon строится вокруг преобразования объекта
DateTime в строковые представления и обратно. Библиотека
изначально ориентирована на строгие стандарты (ISO, RFC, HTTP), но также
предоставляет гибкий механизм пользовательского форматирования через
токены.
Основная идея заключается в том, что одно и то же значение времени может иметь множество форм записи, и выбор формы зависит от контекста: хранения, передачи по сети, отображения пользователю или обмена между системами.
Luxon поддерживает несколько встроенных стандартов, которые используются для совместимости с внешними системами и API.
ISO-формат является основным в Luxon и используется по умолчанию во многих методах.
import { DateTime } from "luxon";
const dt = DateTime.now();
dt.toISO();
Особенности ISO:
Дополнительные варианты ISO:
dt.toISODate(); // только дата: 2026-05-23
dt.toISOTime(); // только время: 14:32:10.123
dt.toISOWeekDate(); // неделя ISO
dt.toISOSeconds(); // без миллисекунд
dt.toISO() // полный формат
Формат, часто используемый в email-системах и старых веб-протоколах.
dt.toRFC2822();
Пример результата:
Sat, 23 May 2026 14:32:10 +0600
Характеристики:
Используется в заголовках HTTP (например, Last-Modified,
Date).
dt.toHTTP();
Пример:
Sat, 23 May 2026 08:32:10 GMT
Особенность — всегда UTC/GMT.
Luxon предоставляет мощный механизм форматирования через метод
toFormat(), основанный на токенах.
dt.toFormat("dd.MM.yyyy HH:mm");
Пример результата:
23.05.2026 14:32
Форматирование в Luxon строится на наборе символов-токенов, каждый из которых отвечает за конкретную часть даты или времени.
| Токен | Значение | Пример |
|---|---|---|
yyyy |
год | 2026 |
yy |
последние 2 цифры года | 26 |
MM |
месяц (2 цифры) | 05 |
M |
месяц (без ведущего нуля) | 5 |
dd |
день месяца | 23 |
d |
день без нуля | 23 |
| Токен | Значение | Пример |
|---|---|---|
HH |
часы (24-часовой формат) | 14 |
hh |
часы (12-часовой формат) | 02 |
mm |
минуты | 32 |
ss |
секунды | 10 |
a |
AM/PM | PM |
S / SSS |
миллисекунды | 123 |
| Токен | Значение | Пример |
|---|---|---|
ZZ |
смещение | +06:00 |
z |
название зоны | Asia/Almaty |
ZZZ |
сокращённое смещение | +0600 |
Гибкость toFormat() позволяет строить любые
пользовательские представления.
dt.toFormat("yyyy-MM-dd");
// 2026-05-23
dt.toFormat("dd/MM/yyyy");
// 23/05/2026
dt.toFormat("HH:mm:ss");
// 14:32:10
dt.toFormat("d LLLL yyyy, HH:mm");
// 23 May 2026, 14:32
Здесь LLLL выводит полное название месяца.
Luxon учитывает локаль при форматировании:
dt.setLocale("ru").toFormat("d LLLL yyyy");
// 23 мая 2026
Локаль влияет на:
Luxon поддерживает обратное преобразование строк в
DateTime через методы парсинга.
DateTime.fromISO("2026-05-23T14:32:10.123+06:00");
Наиболее надёжный способ, так как ISO строго стандартизирован.
DateTime.fromFormat("23.05.2026 14:32", "dd.MM.yyyy HH:mm");
Важно:
Проверка валидности:
const dt = DateTime.fromFormat("23.05.2026", "dd.MM.yyyy");
dt.isValid;
DateTime.fromRFC2822("Sat, 23 May 2026 14:32:10 +0600");
DateTime.fromHTTP("Sat, 23 May 2026 08:32:10 GMT");
DateTime.fromMillis(1716468730123);
DateTime.fromSeconds(1716468730);
DateTime.fromObject({
year: 2026,
month: 5,
day: 23,
hour: 14,
minute: 32
});
Этот метод используется при ручной сборке даты без строкового парсинга.
Форматирование в Luxon всегда зависит от текущей временной зоны
объекта DateTime.
const dt = DateTime.now().setZone("Asia/Almaty");
dt.toFormat("HH:mm ZZZZ");
Если зона не задана явно, используется системная.
Особенности:
Локаль влияет не только на текстовые элементы, но и на порядок отображения компонентов даты.
DateTime.now()
.setLocale("en")
.toFormat("cccc, d LLLL");
// Saturday, 23 May
DateTime.now()
.setLocale("ru")
.toFormat("cccc, d LLLL");
// суббота, 23 мая
Некоторые символы в шаблоне могут быть интерпретированы как токены. Для их безопасного использования применяется экранирование:
dt.toFormat("'Дата:' dd.MM.yyyy");
// Дата: 23.05.2026
Правила:
Luxon не предоставляет встроенной условной логики в форматах, но её можно имитировать:
const formatted =
dt.hour < 12
? dt.toFormat("dd.MM.yyyy 'утро' HH:mm")
: dt.toFormat("dd.MM.yyyy 'вечер' HH:mm");
При работе с API часто используется автоматическая сериализация:
JSON.stringify(dt);
Luxon использует метод toJSON(), который возвращает
ISO-строку:
"2026-05-23T14:32:10.123+06:00"
Форматы можно комбинировать с другими операциями
DateTime:
dt
.setZone("UTC")
.toFormat("yyyy-MM-dd HH:mm");
Или:
dt.plus({ days: 2 }).toISODate();
Основные причины невалидных результатов:
Проверка всегда выполняется через:
result.isValid;
result.invalidReason;
toFormat() обеспечивает гибкость отображенияfromFormat() требует строгого соответствия шаблону