Локаль для конкретного объекта

В библиотеке 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 остаётся с локалью en
  • dt2 содержит локаль 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 г.

Однако некоторые локализованные компоненты всё равно зависят от текущей локали (например, названия месяцев).


Локаль при форматировании с Intl

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.


Приоритет локали: создание, изменение, форматирование

Локаль может быть задана на нескольких уровнях:

  1. При создании объекта
  2. Через setLocale
  3. Через переопределение в форматировании (неявно через новый объект)

При этом действует простое правило:

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

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_FULL
  • DATE_HUGE
  • DATE_MED
  • DATETIME_FULL
  • TIME_WITH_SECONDS
DateTime.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.