Luxon предоставляет слой поверх стандартного Date и API
Intl, позволяя формировать стабильное, локализованное и
предсказуемое отображение дат в пользовательском интерфейсе. Основная
задача при работе с UI — не хранение или вычисление времени, а
корректная визуализация: форматирование, локализация, работа с часовыми
поясами, адаптация под контекст экрана и сценарий использования.
Отображение даты в UI почти всегда зависит от трёх факторов:
Luxon оперирует объектом DateTime, который уже содержит
информацию о таймзоне и локали, что критично для UI-рендеринга.
import { DateTime } from "luxon";
const dt = DateTime.now();
Наиболее безопасный способ отображения дат в UI — использование
встроенных пресетов toLocaleString.
dt.toLocaleString(DateTime.DATE_MED);
Распространённые пресеты:
DATE_SHORT — 01.05.2026DATE_MED — 1 мая 2026 г.DATE_FULL — 1 мая 2026 годаDATE_HUGE — пятница, 1 мая 2026 годаTIME_SIMPLE — 14:30DATETIME_MED — 1 мая 2026 г., 14:30DATETIME_FULL — полная дата с часовым поясомИспользование пресетов снижает риск ошибок локализации и обеспечивает единообразие интерфейса.
Luxon поддерживает настройку локали через метод
setLocale.
const dt = DateTime.now().setLocale("ru");
dt.toLocaleString(DateTime.DATE_FULL);
Ключевые особенности:
Для UI важно централизованно задавать локаль на уровне приложения, а не отдельных компонентов.
Когда предустановок недостаточно, используется toFormat
с токенами:
dt.toFormat("dd.MM.yyyy HH:mm");
Основные токены:
yyyy — годMM — месяц (двузначный)dd — деньHH — часы (24-часовой формат)mm — минутыss — секундыПример для UI-карточки:
dt.toFormat("dd LLL yyyy, HH:mm");
Результат может выглядеть как: 01 мая 2026, 14:30
UI почти всегда требует разных форматов для одного и того же значения.
dt.toLocaleString(DateTime.DATE_SHORT);
Используется в таблицах, списках, уведомлениях.
dt.toLocaleString(DateTime.DATETIME_MED);
Используется в превью, лентах, карточках заказов.
dt.toLocaleString(DateTime.DATETIME_FULL);
Используется для логов, истории, транзакций.
Для UX-интерфейсов часто требуется не абсолютная дата, а относительная.
dt.toRelative();
Примеры вывода:
Также доступен календарный формат:
dt.toRelativeCalendar();
Примеры:
Важно учитывать, что относительное время зависит от текущего момента и требует регулярного обновления в UI.
UI часто отображает время в разных зонах:
dt.setZone("Europe/Almaty").toLocaleString(DateTime.DATETIME_MED);
Ключевые сценарии:
Ошибки в UI чаще всего возникают из-за смешивания UTC и локального времени без явного преобразования.
При SSR важно избегать расхождения:
const serverTime = DateTime.utc().toISO();
const clientTime = DateTime.fromISO(serverTime).toLocal();
Рекомендуемая стратегия:
UI часто требует динамического выбора формата:
function formatDate(dt) {
if (dt.diffNow("days").days > -1) {
return dt.toRelative();
}
if (dt.diffNow("years").years < -1) {
return dt.toLocaleString(DateTime.DATE_FULL);
}
return dt.toLocaleString(DateTime.DATE_MED);
}
Такая логика используется в:
Для сообщений часто используется комбинированная стратегия:
dt.toFormat("HH:mm");
или
dt.toRelativeCalendar();
Выбор зависит от возраста сообщения:
UI должен учитывать некорректные значения:
const dt = DateTime.fromISO("invalid");
if (!dt.isValid) {
return "—";
}
Без проверки isValid интерфейс может получить
Invalid DateTime, что ломает отображение.
При массовом рендеринге (таблицы, списки) важно избегать повторного форматирования:
toLocaleStringsetZone в рендереПример:
const formatted = dt.toLocaleString(DateTime.DATETIME_MED);
Luxon использует Intl, поэтому поведение зависит от
окружения браузера или Node.js.
Особенности:
setLocaledt.toLocaleString(DateTime.DATETIME_FULL)
dt.toLocaleString(DateTime.DATE_SHORT)
dt.toRelative()
dt.toFormat("yyyy-LL-dd HH:mm:ss.SSS ZZZ")
UI может изменять формат в зависимости от ширины экрана:
DATE_SHORTDATETIME_MEDDATETIME_FULLfunction getFormat(width) {
if (width < 600) return DateTime.DATE_SHORT;
if (width < 1200) return DateTime.DATETIME_MED;
return DateTime.DATETIME_FULL;
}
Для предотвращения визуальных расхождений:
new Date()DateTime.fromISO или
fromMilliszone и locale при создании
объектаDateTime.fromISO(isoString, {
zone: "utc",
locale: "ru"
});