Форматирование даты и времени в библиотеке Luxon строится на шаблонах, состоящих из специальных токенов. Между токенами размещаются разделители — символы, строки и конструкции, определяющие внешний вид итоговой даты.
Разделители используются практически во всех сценариях:
Наиболее распространённые разделители:
| Разделитель | Назначение | Пример |
|---|---|---|
/ |
разделение даты | 10/03/2026 |
- |
ISO-формат | 2026-03-10 |
. |
европейский формат | 10.03.2026 |
: |
разделение времени | 14:30:45 |
(пробел) |
разделение частей | 2026-03-10 14:30 |
, |
разделение даты и времени | March 10, 2026 |
Пример:
import { DateTime } from "luxon";
const dt = DateTime.now();
console.log(dt.toFormat("dd.MM.yyyy"));
console.log(dt.toFormat("yyyy-MM-dd"));
console.log(dt.toFormat("HH:mm:ss"));
Результат:
10.03.2026
2026-03-10
14:30:45
toFormat()Метод toFormat() позволяет строить строку вручную.
Шаблон:
DateTime.now().toFormat("dd/MM/yyyy");
Здесь:
dd — день;/ — разделитель;MM — месяц;/ — второй разделитель;yyyy — год.Luxon не ограничивает набор разделителей. Между токенами допускаются любые символы.
Дефис особенно важен при работе с ISO-совместимыми строками.
Пример:
const dt = DateTime.now();
console.log(dt.toFormat("yyyy-MM-dd"));
Результат:
2026-03-10
Такой формат часто используется:
Точка характерна для европейских форматов даты.
const dt = DateTime.now();
console.log(dt.toFormat("dd.MM.yyyy"));
Результат:
10.03.2026
Формат активно применяется:
Слэш распространён в американских и международных интерфейсах.
console.log(
DateTime.now().toFormat("MM/dd/yyyy")
);
Результат:
03/10/2026
Для времени чаще всего используется двоеточие.
console.log(
DateTime.now().toFormat("HH:mm:ss")
);
Результат:
14:35:20
Структура:
| Токен | Значение |
|---|---|
HH |
часы |
: |
разделитель |
mm |
минуты |
: |
разделитель |
ss |
секунды |
Разделителем может быть сразу несколько символов.
Пример:
console.log(
DateTime.now().toFormat("dd-MM-yyyy HH:mm")
);
Результат:
10-03-2026 14:35
Используются:
В шаблонах допускается обычный текст.
console.log(
DateTime.now().toFormat("dd MMMM yyyy year")
);
Результат:
10 March 2026 year
Однако здесь появляется важная особенность Luxon.
Luxon воспринимает многие символы как токены форматирования. Чтобы вставить обычный текст, используются одинарные кавычки.
Правильный вариант:
console.log(
DateTime.now().toFormat("dd MMMM yyyy 'year'")
);
Результат:
10 March 2026 year
Без экранирования часть символов может интерпретироваться как команды форматирования.
Запятая часто применяется между датой и временем.
console.log(
DateTime.now().toFormat("MMMM dd, yyyy")
);
Результат:
March 10, 2026
Luxon позволяет свободно комбинировать символы.
console.log(
DateTime.now().toFormat("dd.MM.yyyy | HH:mm:ss")
);
Результат:
10.03.2026 | 14:40:12
Разделителем здесь выступает строка:
|
В качестве разделителя может использоваться практически любой набор символов.
Пример:
console.log(
DateTime.now().toFormat("dd=>MM=>yyyy")
);
Результат:
10=>03=>2026
Luxon корректно работает с Unicode-символами.
console.log(
DateTime.now().toFormat("dd • MM • yyyy")
);
Результат:
10 • 03 • 2026
Другой пример:
console.log(
DateTime.now().toFormat("HH ч mm мин")
);
Результат:
14 ч 45 мин
Разделители можно задавать вручную либо доверить локали.
Пример локализованного формата:
const dt = DateTime.now().setLocale("ru");
console.log(dt.toLocaleString(DateTime.DATE_FULL));
Результат:
10 марта 2026 г.
Здесь разделители определяются самой локалью.
toFormat() и toLocaleString()toFormat()Полный ручной контроль:
dt.toFormat("dd.MM.yyyy HH:mm")
toLocaleString()Автоматические разделители:
dt.toLocaleString(DateTime.DATETIME_SHORT)
Luxon умеет генерировать ISO-строки автоматически.
const dt = DateTime.now();
console.log(dt.toISO());
Результат:
2026-03-10T14:50:22.000+03:00
Используемые разделители:
| Символ | Назначение |
|---|---|
- |
разделение даты |
T |
разделение даты и времени |
: |
разделение времени |
. |
миллисекунды |
+ |
смещение timezone |
T как
разделительВ ISO-формате символ T отделяет дату от времени.
2026-03-10T14:50:22
Пример ручного шаблона:
dt.toFormat("yyyy-MM-dd'T'HH:mm:ss")
Кавычки обязательны, иначе T может интерпретироваться
как токен.
console.log(
DateTime.now().toFormat("HH:mm:ss.SSS")
);
Результат:
14:55:20.123
Точка выступает разделителем между секундами и миллисекундами.
Пример:
console.log(
DateTime.now().toFormat("HH:mm:ss ZZZ")
);
Результат:
14:55:20 +0300
Пробел разделяет время и часовой пояс.
Luxon позволяет создавать сложные шаблоны.
console.log(
DateTime.now().toFormat(
"dd 'days,' HH 'hours and' mm 'minutes'"
)
);
Результат:
10 days, 14 hours and 25 minutes
Логи часто требуют компактного формата.
const timestamp = DateTime.now()
.toFormat("yyyy-MM-dd HH:mm:ss");
console.log(`[${timestamp}] Server started`);
Результат:
[2026-03-10 15:00:10] Server started
Некоторые символы недопустимы в именах файлов.
Проблемный вариант:
15:20:10
Безопасный вариант:
const fileDate = DateTime.now()
.toFormat("yyyy-MM-dd_HH-mm-ss");
Результат:
2026-03-10_15-20-10
Шаблон при парсинге должен совпадать со строкой.
Пример:
const dt = DateTime.fromFormat(
"10.03.2026",
"dd.MM.yyyy"
);
Если разделители не совпадают:
DateTime.fromFormat(
"10/03/2026",
"dd.MM.yyyy"
);
парсинг завершится ошибкой.
const dt = DateTime.fromFormat(
"10/03/2026",
"dd.MM.yyyy"
);
console.log(dt.isValid);
Результат:
false
Если требуется вывести сам символ ', используется
двойное экранирование.
Пример:
console.log(
DateTime.now().toFormat("dd 'o''clock'")
);
Результат:
10 o'clock
Ошибка:
dt.toFormat("dd MMMM year")
Правильно:
dt.toFormat("dd MMMM 'year'")
Ошибка:
DateTime.fromFormat(
"2026/03/10",
"yyyy-MM-dd"
);
Правильно:
DateTime.fromFormat(
"2026/03/10",
"yyyy/MM/dd"
);
Ошибка:
HH:mm:ss
Правильно:
HH-mm-ss
dd.MM.yyyy
MM/dd/yyyy
yyyy-MM-dd
yyyy-MM-dd HH:mm:ss
yyyy-MM-dd_HH-mm-ss
[yyyy-MM-dd HH:mm:ss]
DurationРазделители используются и при форматировании продолжительности.
import { Duration } from "luxon";
const duration = Duration.fromObject({
hours: 2,
minutes: 15,
seconds: 30
});
console.log(
duration.toFormat("hh:mm:ss")
);
Результат:
02:15:30
import { Interval, DateTime } from "luxon";
const start = DateTime.now();
const end = start.plus({ days: 5 });
const interval = Interval.fromDateTimes(start, end);
console.log(
`${interval.start.toFormat("dd.MM.yyyy")} - ${interval.end.toFormat("dd.MM.yyyy")}`
);
Результат:
10.03.2026 - 15.03.2026
Символ - выступает разделителем диапазона дат.