В библиотеке Luxon форматирование даты и времени строится вокруг
метода toFormat(). В отличие от стандартных методов
toISO() или toLocaleString(), он позволяет
полностью контролировать итоговое представление даты.
import { DateTime } from "luxon";
const dt = DateTime.now();
console.log(dt.toFormat("dd.MM.yyyy"));
// 14.03.2026
Метод принимает строку-шаблон, состоящую из специальных токенов. Каждый токен отвечает за определённую часть даты или времени.
Формат строится как комбинация токенов:
DateTime.now().toFormat("yyyy-MM-dd");
Результат:
2026-03-14
Разбор шаблона:
| Токен | Значение |
|---|---|
yyyy |
год |
MM |
месяц |
dd |
день |
Токены можно комбинировать любым способом.
dt.toFormat("yyyy");
2026
dt.toFormat("yy");
26
dt.toFormat("M");
3
dt.toFormat("MM");
03
dt.toFormat("MMM");
Mar
dt.toFormat("MMMM");
March
dt.toFormat("d");
7
dt.toFormat("dd");
07
dt.toFormat("ccc");
Sat
dt.toFormat("cccc");
Saturday
dt.toFormat("HH");
21
dt.toFormat("mm");
05
dt.toFormat("ss");
09
dt.toFormat("HH:mm");
21:30
dt.toFormat("hh:mm a");
09:30 PM
Токен a выводит AM/PM.
dt.toFormat("dd.MM.yyyy");
14.03.2026
dt.toFormat("yyyy-MM-dd HH:mm:ss");
2026-03-14 21:30:15
dt.toFormat("dd MMMM yyyy");
14 March 2026
dt.toFormat("cccc, dd MMMM yyyy HH:mm:ss");
Saturday, 14 March 2026 21:30:15
Любой текст внутри шаблона можно вставлять напрямую.
dt.toFormat("dd/MM/yyyy 'в' HH:mm");
14/03/2026 в 21:30
Текст заключается в одинарные кавычки.
Если необходимо вывести символы, совпадающие с токенами, используется экранирование через кавычки.
dt.toFormat("'Год:' yyyy");
Год: 2026
Формат можно комбинировать с локалями.
const dt = DateTime.now().setLocale("ru");
console.log(
dt.toFormat("dd MMMM yyyy")
);
14 марта 2026
dt.toFormat("HH:mm ZZZ");
21:30 UTC+6
dt.toFormat("HH:mm ZZ");
21:30 +06:00
dt.toFormat("ZZZZ");
East Kazakhstan Time
dt.toFormat("HH:mm:ss.SSS");
21:30:15.273
dt.toSeconds();
dt.toMillis();
При работе с проектом удобно хранить шаблоны отдельно.
const DATE_FORMAT = "dd.MM.yyyy";
const TIME_FORMAT = "HH:mm:ss";
console.log(
dt.toFormat(DATE_FORMAT)
);
console.log(
dt.toFormat(TIME_FORMAT)
);
const formats = {
shortDate: "dd.MM.yyyy",
longDate: "dd MMMM yyyy",
db: "yyyy-MM-dd HH:mm:ss",
file: "yyyyMMdd_HHmmss"
};
console.log(
dt.toFormat(formats.db)
);
dt.toFormat("yyyyMMdd_HHmmss");
20260314_213015
dt.toFormat("[LOG] yyyy-MM-dd HH:mm:ss");
[LOG] 2026-03-14 21:30:15
dt.toFormat("yyyy-MM-dd");
Пример URL:
/articles/2026-03-14
dt.toFormat("yyyy-MM-dd'T'HH:mm:ss");
2026-03-14T21:30:15
dt.toFormat("yyyyMMddHHmmss");
20260314213015
toFormat() от toLocaleString()toFormat()dt.toFormat("dd.MM.yyyy");
toLocaleString()dt.toLocaleString(DateTime.DATE_FULL);
| Токен | Описание | Пример |
|---|---|---|
yyyy |
полный год | 2026 |
yy |
короткий год | 26 |
MM |
месяц | 03 |
MMM |
краткий месяц | Mar |
MMMM |
полный месяц | March |
dd |
день | 09 |
HH |
часы 24h | 21 |
hh |
часы 12h | 09 |
mm |
минуты | 05 |
ss |
секунды | 08 |
SSS |
миллисекунды | 273 |
a |
AM/PM | PM |
ZZ |
UTC offset | +06:00 |
ccc |
краткий день недели | Sat |
cccc |
полный день недели | Saturday |
function formatDate(date) {
return date.toFormat("dd.MM.yyyy");
}
function formatDateTime(date) {
return date.toFormat(
"dd.MM.yyyy HH:mm:ss"
);
}
function logTime() {
return DateTime.now().toFormat(
"[LOG] yyyy-MM-dd HH:mm:ss"
);
}
const createdAt = dt.toFormat(
"dd MMM yyyy"
);
14 Mar 2026
const messageTime = dt.toFormat(
"HH:mm"
);
21:30
const adminDate = dt.toFormat(
"yyyy-MM-dd HH:mm:ss"
);
dt.toFormat(
"'Документ создан:' dd.MM.yyyy"
);
Документ создан: 14.03.2026
function createFormat(includeSeconds) {
return includeSeconds
? "HH:mm:ss"
: "HH:mm";
}
console.log(
dt.toFormat(createFormat(true))
);
Проблемы часто возникают из-за смешивания разных шаблонов:
"dd.MM.yyyy"
"MM/dd/yyyy"
"yyyy-MM-dd"
Для крупных проектов обычно выбирается единый стандарт:
const STANDARD_DATE = "yyyy-MM-dd";
mm вместо
MMdt.toFormat("dd.mm.yyyy");
Ошибка:
14.30.2026
Потому что mm — минуты.
Правильно:
dt.toFormat("dd.MM.yyyy");
HH и
hhdt.toFormat("hh:mm");
09:00
Но неизвестно — утро или вечер.
Правильно:
dt.toFormat("hh:mm a");
dt.toFormat("Дата: dd.MM.yyyy");
Некоторые символы могут интерпретироваться как токены.
Надёжнее:
dt.toFormat("'Дата:' dd.MM.yyyy");
toFormat() мощнее стандартных пресетов, но требует
дополнительного парсинга шаблона.
При большом количестве операций:
Пример:
const FORMAT = "yyyy-MM-dd";
for (const item of items) {
console.log(
item.date.toFormat(FORMAT)
);
}
const formats = {
short: "dd.MM.yyyy",
full: "dd.MM.yyyy HH:mm:ss",
iso: "yyyy-MM-dd",
log: "[LOG] yyyy-MM-dd HH:mm:ss",
filename: "yyyyMMdd_HHmmss",
time: "HH:mm",
api: "yyyy-MM-dd'T'HH:mm:ss"
};
Использование:
dt.toFormat(formats.full);
dt.toFormat(formats.api);
dt.toFormat(formats.filename);