В библиотеке Luxon локаль (locale) задаёт правила
форматирования даты и времени в соответствии с языком и региональными
соглашениями. Она влияет на отображение названий месяцев, дней недели,
форматы чисел, порядок элементов даты и другие аспекты, зависящие от
Intl.
Каждый объект DateTime хранит собственное значение
локали. Это означает, что локаль не является глобальной настройкой, а
привязана к конкретному экземпляру.
Ключевой принцип:
локаль — часть состояния объекта DateTime, как и
время, таймзона или календарь
Luxon позволяет задать локаль в момент создания экземпляра через опции конфигурации.
import { DateTime } from "luxon";
const dt = DateTime.fromISO("2026-05-23T10:00:00", {
locale: "ru"
});
В этом случае объект dt будет форматировать дату с
учётом русской локали.
Локаль можно задавать в любом методе создания:
DateTime.local(2026, 5, 23, {
locale: "en"
});
DateTime.fromJSDate(new Date(), {
locale: "fr"
});
Также локаль может быть указана вместе с другими параметрами:
DateTime.fromObject(
{ year: 2026, month: 5, day: 23 },
{ locale: "de", zone: "Europe/Berlin" }
);
Объекты DateTime в Luxon неизменяемые. Любая модификация
возвращает новый экземпляр.
Для изменения локали используется метод setLocale:
const dt1 = DateTime.local(2026, 5, 23, { locale: "en" });
const dt2 = dt1.setLocale("ru");
В результате:
dt1 остаётся с локалью endt2 содержит локаль ruЭто важное свойство архитектуры Luxon: любые преобразования создают новый объект, исключая побочные эффекты.
Локаль проявляется при форматировании даты и времени. Сам объект
DateTime не меняет внутреннее значение времени — изменяется
только представление.
Пример использования toLocaleString:
const dt = DateTime.fromISO("2026-05-23T10:00:00");
dt.setLocale("en").toLocaleString(DateTime.DATE_FULL);
// May 23, 2026
dt.setLocale("ru").toLocaleString(DateTime.DATE_FULL);
// 23 мая 2026 г.
Форматирование через toFormat напрямую локаль не
использует, так как оно работает на уровне токенов:
dt.setLocale("ru").toFormat("DDDD");
// 23 мая 2026 г.
Однако некоторые локализованные компоненты всё равно зависят от текущей локали (например, названия месяцев).
Luxon использует встроенный Intl.DateTimeFormat для
методов семейства toLocaleString. Локаль объекта передаётся
в форматтер автоматически.
const dt = DateTime.local().setLocale("fr");
dt.toLocaleString(DateTime.DATE_HUGE);
// samedi 23 mai 2026
Если локаль не задана явно, используется системная локаль окружения (браузер или Node.js).
При цепочечных вызовах локаль сохраняется, если она не переопределяется.
const base = DateTime.local().setLocale("ru");
const updated = base
.plus({ days: 2 })
.setZone("Europe/Moscow");
updated.toLocaleString(DateTime.DATE_FULL);
Во всей цепочке локаль остаётся ru, если её не изменить
через setLocale.
Локаль может быть задана на нескольких уровнях:
setLocaleПри этом действует простое правило:
последнее присвоенное значение локали в цепочке операций определяет итоговый вывод
DateTime.fromISO("2026-05-23", { locale: "en" })
.setLocale("ru")
.setLocale("de")
.toLocaleString(DateTime.DATE_FULL);
Итоговая локаль — de.
При разборе строк локаль не влияет на сам процесс интерпретации
ISO-форматов, но может быть полезна при разборе нестандартных строк
через fromFormat.
DateTime.fromFormat("23 mai 2026", "dd LLLL yyyy", {
locale: "fr"
});
Здесь локаль определяет:
Без корректной локали парсинг подобных строк может дать неверный результат.
Некоторые форматы полностью зависят от локали:
DATE_FULLDATE_HUGEDATE_MEDDATETIME_FULLTIME_WITH_SECONDSDateTime.local().setLocale("ja").toLocaleString(DateTime.DATE_HUGE);
// 2026年5月23日土曜日
Другие форматы менее чувствительны, например:
DateTime.local().setLocale("ru").toFormat("yyyy-LL-dd");
// 2026-05-23
Методы, создающие новые объекты (plus,
minus, startOf, endOf), не
изменяют локаль:
const dt = DateTime.local().setLocale("ru");
const next = dt.plus({ days: 1 });
next.locale; // "ru"
Это поведение гарантирует консистентность отображения при трансформациях времени.
Локаль не связана напрямую с таймзоной или календарём, но часто используется вместе с ними:
const dt = DateTime.fromObject(
{ year: 2026, month: 5, day: 23 },
{
locale: "ar",
zone: "Asia/Dubai",
outputCalendar: "islamic"
}
);
Каждый параметр отвечает за свою область:
locale — язык отображенияzone — временная зонаoutputCalendar — календарная системаФормирование мультиязычных интерфейсов:
const enDate = DateTime.local().setLocale("en");
const ruDate = DateTime.local().setLocale("ru");
enDate.toLocaleString(DateTime.DATE_FULL);
ruDate.toLocaleString(DateTime.DATE_FULL);
Сохранение локали пользователя в модели данных:
function formatUserDate(date, userLocale) {
return DateTime.fromJSDate(date, { locale: userLocale })
.toLocaleString(DateTime.DATE_MED);
}
Переключение языка отображения без изменения исходных данных:
const base = DateTime.fromISO("2026-05-23T10:00:00");
const views = {
en: base.setLocale("en"),
ru: base.setLocale("ru"),
fr: base.setLocale("fr")
};
Если указана локаль, отсутствующая в окружении, Luxon передаёт её в
Intl, который выполняет fallback:
en)en-US вместо
en-XX)Luxon не выполняет самостоятельную валидацию локалей, полагаясь на стандарт ECMAScript Internationalization API.