Пресеты форматирования

В библиотеке Luxon форматирование дат и времени основано на двух основных подходах: низкоуровневое управление через шаблоны и высокоуровневые пресеты. Пресеты представляют собой заранее определённые конфигурации отображения, построенные поверх возможностей Intl API, и предназначены для стандартизированного вывода дат в типичных сценариях интерфейсов и отчётов.

Ключевая особенность пресетов заключается в том, что они инкапсулируют сложность локализации и выбора формата, предоставляя набор стабильных именованных вариантов, поведение которых зависит от текущей локали.


Базовый механизм применения пресетов

В Luxon пресеты используются через метод:

DateTime.toLocaleString(formatOpts)

или через прямую передачу констант из объекта DateTime.

Пример:

import { DateTime } from "luxon";

const dt = DateTime.now();

dt.toLocaleString(DateTime.DATE_FULL);

Здесь DateTime.DATE_FULL — это пресет форматирования даты без времени.


Архитектура пресетов

Каждый пресет в Luxon является объектом конфигурации, который передаётся в Intl.DateTimeFormat. Внутри библиотеки он выглядит как набор опций:

  • year
  • month
  • day
  • weekday
  • hour
  • minute
  • second
  • timeZoneName

Пресеты позволяют скрыть эти детали, заменяя их именованными константами.


Пресеты для даты

DATE_SHORT

Минимальный формат даты, ориентированный на компактное отображение.

dt.toLocaleString(DateTime.DATE_SHORT);

Типичный результат:

  • 24.05.26 (в зависимости от локали)

Характерные свойства:

  • сокращённые числовые представления
  • отсутствие дня недели
  • минимальная детализация

DATE_MED

Средний уровень детализации даты.

dt.toLocaleString(DateTime.DATE_MED);

Пример вывода:

  • 24 мая 2026 г.

Особенности:

  • расширенное отображение месяца
  • более читаемый формат по сравнению с DATE_SHORT

DATE_MED_WITH_WEEKDAY

Добавляет день недели к среднему формату даты.

dt.toLocaleString(DateTime.DATE_MED_WITH_WEEKDAY);

Пример:

  • воскресенье, 24 мая 2026 г.

Используется в интерфейсах, где важен контекст дня недели.


DATE_FULL

Полный формат даты с текстовым представлением месяца и дня недели.

dt.toLocaleString(DateTime.DATE_FULL);

Пример:

  • воскресенье, 24 мая 2026 г.

Особенности:

  • максимальная читаемость
  • текстовое представление компонентов даты
  • высокая зависимость от локали

DATE_HUGE

Наиболее расширенный вариант отображения даты.

dt.toLocaleString(DateTime.DATE_HUGE);

Пример:

  • воскресенье, 24 мая 2026 года

Характеристики:

  • полное текстовое представление
  • использование словесных форм локали
  • подходит для формальных документов

Пресеты времени

TIME_SIMPLE

Простой формат времени без секунд.

dt.toLocaleString(DateTime.TIME_SIMPLE);

Пример:

  • 14:35

Особенности:

  • минимальная детализация
  • отсутствие секунд
  • часто используется в UI

TIME_WITH_SECONDS

Добавляет секунды к времени.

dt.toLocaleString(DateTime.TIME_WITH_SECONDS);

Пример:

  • 14:35:42

Применяется в системах, где важна точность отображения времени.


Комбинированные пресеты даты и времени

DATETIME_SHORT

Компактное отображение даты и времени.

dt.toLocaleString(DateTime.DATETIME_SHORT);

Пример:

  • 24.05.26, 14:35

Особенности:

  • числовое представление
  • минимальная длина строки
  • оптимизация для плотных интерфейсов

DATETIME_MED

Средний уровень детализации для даты и времени.

dt.toLocaleString(DateTime.DATETIME_MED);

Пример:

  • 24 мая 2026 г., 14:35

Характеристики:

  • баланс читаемости и компактности
  • текстовые элементы месяца

DATETIME_FULL

Полный формат даты и времени.

dt.toLocaleString(DateTime.DATETIME_FULL);

Пример:

  • воскресенье, 24 мая 2026 г., 14:35

Особенности:

  • включение дня недели
  • полное текстовое представление даты
  • стандартизированная локализация

DATETIME_HUGE

Максимально подробный формат даты и времени.

dt.toLocaleString(DateTime.DATETIME_HUGE);

Пример:

  • воскресенье, 24 мая 2026 г., 14:35:42

Характеристики:

  • максимальная детализация
  • текстовые формы всех компонентов
  • ориентирован на формальные и архивные представления

Поведение пресетов в разных локалях

Пресеты Luxon не фиксируют конкретный формат строки. Они зависят от текущей локали, установленной в объекте DateTime:

DateTime.local().setLocale("ru");
DateTime.local().setLocale("en");

Это означает:

  • порядок компонентов может меняться
  • названия месяцев и дней недели локализуются
  • разделители зависят от региональных стандартов

Связь пресетов и Intl.DateTimeFormat

Внутренне каждый пресет транслируется в конфигурацию:

new Intl.DateTimeFormat(locale, options)

Например:

DateTime.DATE_MED

эквивалентен примерно:

{
  year: "numeric",
  month: "long",
  day: "numeric"
}

Такой подход обеспечивает:

  • консистентность с веб-стандартами
  • поддержку всех современных локалей
  • отсутствие необходимости вручную управлять форматами

Отличие пресетов от шаблонного форматирования

Пресеты и .toFormat() решают разные задачи.

Пресеты

dt.toLocaleString(DateTime.DATE_FULL);
  • локализованные форматы
  • зависимость от Intl API
  • адаптация под регион

Шаблоны

dt.toFormat("dd LLL yyyy");
  • фиксированный формат
  • независимость от локали
  • полный контроль над выводом

Пресеты применяются в пользовательских интерфейсах, где требуется адаптивность, тогда как шаблоны используются в технических и интеграционных задачах.


Комбинирование пресетов с параметрами

Luxon позволяет модифицировать поведение пресета:

dt.toLocaleString({
  ...DateTime.DATE_MED,
  weekday: "long"
});

Такой подход даёт возможность:

  • расширять стандартные форматы
  • добавлять дополнительные поля
  • сохранять базовую структуру пресета

Использование пресетов через объект DateTime

Пресеты доступны как статические свойства:

DateTime.DATE_SHORT
DateTime.DATE_MED
DateTime.DATE_FULL
DateTime.DATE_HUGE
DateTime.TIME_SIMPLE
DateTime.TIME_WITH_SECONDS
DateTime.DATETIME_SHORT
DateTime.DATETIME_MED
DateTime.DATETIME_FULL
DateTime.DATETIME_HUGE

Это позволяет применять их без дополнительных импортов и создавать единообразные правила форматирования во всём коде.


Влияние временной зоны на результат

Пресеты учитывают временную зону объекта DateTime:

DateTime.now().setZone("Europe/Paris").toLocaleString(DateTime.DATETIME_FULL);

Изменение зоны влияет на:

  • отображаемое время
  • возможную корректировку даты при переходе границ суток
  • интерпретацию временных значений

Пресеты не изменяют зону, они лишь форматируют уже вычисленное значение.


Типичные сценарии применения пресетов

  • интерфейсы административных панелей (DATETIME_MED)
  • журналы событий (DATETIME_SHORT)
  • официальные документы (DATE_FULL, DATETIME_FULL)
  • компактные списки и таблицы (DATE_SHORT, TIME_SIMPLE)
  • детализированные отчёты (DATE_HUGE, DATETIME_HUGE)

Каждый пресет ориентирован на определённый баланс между читаемостью и объёмом информации.