В библиотеке Luxon локаль определяет правила форматирования дат и времени: названия месяцев, дней недели, формат чисел, порядок элементов даты, особенности отображения времени. В основе лежит стандарт Internationalization API (Intl), поэтому поведение тесно связано с поддержкой локалей в среде выполнения JavaScript.
Локаль может задаваться на разных уровнях, и именно порядок приоритетов делает систему гибкой:
DateTimeSettings.defaultLocaleОбъект Settings в Luxon представляет глобальное
хранилище конфигурации, влияющее на поведение всех создаваемых
экземпляров DateTime.
Он находится в модуле luxon и содержит параметры,
которые действуют как значения по умолчанию:
defaultZonedefaultLocaledefaultOutputCalendarthrowOnInvalidКаждый из этих параметров влияет на то, как создаются и форматируются даты без явного указания настроек.
Settings.defaultLocale определяет локаль, которая будет
применяться ко всем объектам DateTime, если локаль не
задана явно.
С точки зрения механики:
DateTime не установлен
.setLocale()localeSettings.defaultLocaleЕсли же Settings.defaultLocale не установлен, Luxon
делегирует выбор локали среде выполнения (обычно en-US или
системная локаль).
Локаль влияет на все методы форматирования:
toLocaleString()toFormat()toLocaleParts()toISODate() (косвенно, через некоторые
представления)Пример влияния:
import { DateTime, Settings } from "luxon";
Settings.defaultLocale = "ru";
const dt = DateTime.now();
console.log(dt.toLocaleString(DateTime.DATE_FULL));
При установленной локали ru результат будет использовать
русские названия месяцев и порядок даты, например:
23 мая 2026 г.
Если локаль изменить:
Settings.defaultLocale = "en";
console.log(dt.toLocaleString(DateTime.DATE_FULL));
Результат изменится на:
May 23, 2026
Luxon использует строгую иерархию:
const dt = DateTime.now().setLocale("fr");
Этот вариант всегда перекрывает глобальную настройку.
Settings.defaultLocale = "de";
Применяется ко всем новым экземплярам без локального override.
Используется, если не задано ничего выше.
Settings.defaultLocale можно изменять в любой момент, и
это сразу влияет на все последующие операции форматирования.
import { DateTime, Settings } from "luxon";
const dt1 = DateTime.now();
console.log(dt1.toLocaleString(DateTime.DATE_MED));
Settings.defaultLocale = "ja";
const dt2 = DateTime.now();
console.log(dt2.toLocaleString(DateTime.DATE_MED));
Важно: уже созданные строки и объекты не пересчитываются, но их методы форматирования будут учитывать новую локаль при следующем вызове.
В Node.js локаль среды часто зависит от системных настроек операционной системы. Это может приводить к различиям между окружениями.
В браузере локаль обычно определяется настройками пользователя
(navigator.language), но Luxon не всегда автоматически
использует её, если задан Settings.defaultLocale.
Поэтому явная установка:
Settings.defaultLocale = "en-GB";
обеспечивает предсказуемое поведение независимо от окружения.
Важно различать:
DateTime из
строкиSettings.defaultLocale влияет в первую очередь на
форматирование. Парсинг ISO-строк (например, fromISO) не
зависит от локали.
const dt = DateTime.fromISO("2026-05-23T10:00:00");
Settings.defaultLocale = "ru";
console.log(dt.toLocaleString(DateTime.DATETIME_FULL));
Локаль изменит только представление результата.
Метод setLocale() задаёт локаль на уровне конкретного
объекта:
import { DateTime, Settings } from "luxon";
Settings.defaultLocale = "ru";
const dt = DateTime.now().setLocale("it");
console.log(dt.toLocaleString(DateTime.DATE_FULL));
Даже при глобальной русской локали формат будет итальянским.
Это особенно важно при работе с мультиязычными интерфейсами, где разные элементы могут использовать разные локали в одном приложении.
Luxon использует иммутабельную модель: каждый метод возвращает новый объект.
const dt1 = DateTime.now();
const dt2 = dt1.setLocale("es");
const dt3 = dt2.plus({ days: 1 });
Локаль сохраняется в цепочке, пока не будет явно переопределена.
Если же глобальная локаль изменится после создания dt1,
это не изменит его текущую локаль, но повлияет на последующие
преобразования без явного override.
Если приложение динамически меняет
Settings.defaultLocale, это влияет на все компоненты,
которые не задают локаль явно.
Разные части приложения могут устанавливать
defaultLocale, перезаписывая друг друга:
Settings.defaultLocale = "ru";
// где-то в другом модуле
Settings.defaultLocale = "en";
В результате итоговая локаль зависит от порядка импорта.
Если не задано ни глобальной, ни локальной настройки, поведение зависит от окружения, что приводит к различиям между dev и prod.
Luxon делегирует форматирование объектам
Intl.DateTimeFormat. Settings.defaultLocale
фактически становится параметром:
new Intl.DateTimeFormat(locale, options)
где locale берётся из:
DateTime.localeSettings.defaultLocaleЭто объясняет, почему Luxon не реализует собственные языковые таблицы — он использует встроенные механизмы JavaScript.
В крупных приложениях глобальная локаль часто используется как стартовое значение:
setLocaleSettings.defaultLocale = getUserLocaleFromProfile();
При таком подходе локаль становится частью конфигурационного слоя приложения, а не логики форматирования.
Luxon может кэшировать некоторые внутренние форматтеры
Intl.DateTimeFormat. Однако изменение
Settings.defaultLocale приводит к созданию новых
форматтеров при следующем использовании, поскольку локаль является
частью ключа конфигурации форматирования.
Luxon предоставляет набор предопределённых форматов:
DATE_SHORTDATE_MEDDATE_FULLDATETIME_FULLВсе они зависят от локали:
Settings.defaultLocale = "fr";
DateTime.now().toLocaleString(DateTime.DATE_FULL);
Формат структуры остаётся тем же, но языковое представление полностью меняется.
Settings.defaultLocale можно вернуть к неопределённому
состоянию:
Settings.defaultLocale = undefined;
В этом случае Luxon снова начинает полагаться на локаль среды выполнения.
В серверном рендеринге важно учитывать, что глобальные настройки могут разделяться между запросами, если используется общий процесс.
Из-за этого изменение Settings.defaultLocale в одном
запросе потенциально влияет на другой, если не используется изоляция
контекста выполнения.
Settings.defaultLocale чаще всего используется как:
Однако в архитектурах с высокой нагрузкой предпочтение обычно
отдаётся явному setLocale, чтобы избежать глобального
состояния.