Создание собственных форматов

В библиотеке 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

Формат 12 и 24 часа

24-часовой формат

dt.toFormat("HH:mm");
21:30

12-часовой формат

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

Смещение относительно UTC

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

Unix Timestamp

В секундах

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

Генерация URL-safe дат

dt.toFormat("yyyy-MM-dd");

Пример URL:

/articles/2026-03-14

Форматы для API

ISO-подобный формат

dt.toFormat("yyyy-MM-dd'T'HH:mm:ss");
2026-03-14T21:30:15

Компактный формат

dt.toFormat("yyyyMMddHHmmss");
20260314213015

Отличие toFormat() от toLocaleString()

toFormat()

  • полный контроль над шаблоном;
  • одинаковое поведение независимо от платформы;
  • удобно для API, БД и логирования.
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 вместо MM

dt.toFormat("dd.mm.yyyy");

Ошибка:

14.30.2026

Потому что mm — минуты.

Правильно:

dt.toFormat("dd.MM.yyyy");

Путаница между HH и hh

dt.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);