Локаль

Локаль в Luxon определяет правила представления даты и времени в человекочитаемом виде: названия месяцев и дней недели, порядок элементов, формат времени, разделители, а также поведение методов форматирования, использующих возможности Intl.DateTimeFormat внутри JavaScript-движка.

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

Каждый объект DateTime содержит информацию о локали. Она влияет только на отображение, но не изменяет сам момент времени.

import { DateTime } from "luxon";

const dt = DateTime.now();

По умолчанию используется локаль среды выполнения (браузер или Node.js), например en-US. Это поведение может меняться через глобальные настройки.

Ключевое правило: локаль не влияет на timestamp, она влияет только на формат вывода.

Установка локали на уровне экземпляра

Luxon позволяет задавать локаль для конкретного объекта DateTime, не затрагивая остальные.

const dt = DateTime.now().setLocale("ru");

После установки локали все методы форматирования начинают использовать правила русского языка:

dt.toLocaleString(DateTime.DATE_FULL);

Результат будет содержать русские названия месяцев и корректный порядок элементов даты.

Метод setLocale возвращает новый объект DateTime, не изменяя исходный экземпляр. Это соответствует иммутабельной модели Luxon.

Глобальная локаль

Для установки локали по умолчанию используется глобальная настройка:

import { Settings } from "luxon";

Settings.defaultLocale = "ru";

После этого все новые экземпляры DateTime, созданные без явного указания локали, будут использовать русский язык.

Глобальная локаль применяется только к новым объектам. Уже созданные экземпляры сохраняют свою локаль.

Форматирование с учётом локали

Основной механизм вывода локализованных строк — метод toLocaleString.

const dt = DateTime.local(2026, 1, 15).setLocale("ru");

dt.toLocaleString(DateTime.DATE_FULL);

Предустановленные форматы:

  • DateTime.DATE_SHORT
  • DateTime.DATE_MED
  • DateTime.DATE_MED_WITH_WEEKDAY
  • DateTime.DATE_FULL
  • DateTime.DATE_HUGE
  • DateTime.DATETIME_SHORT
  • DateTime.DATETIME_MED
  • DateTime.TIME_SIMPLE

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

Пример различий локалей:

DateTime.local(2026, 1, 15).setLocale("en").toLocaleString(DateTime.DATE_FULL);
// January 15, 2026

DateTime.local(2026, 1, 15).setLocale("ru").toLocaleString(DateTime.DATE_FULL);
// 15 января 2026 г.

Пользовательские настройки Intl

Метод toLocaleString принимает дополнительные параметры, которые передаются в Intl.DateTimeFormat.

const dt = DateTime.local();

dt.toLocaleString({
  locale: "ru",
  weekday: "long",
  year: "numeric",
  month: "long",
  day: "2-digit"
});

В этом случае локаль может быть указана прямо в опциях, что переопределяет локаль экземпляра.

Локаль и форматирование времени

Локаль влияет не только на дату, но и на представление времени:

DateTime.local(2026, 1, 15, 18, 30)
  .setLocale("ru")
  .toLocaleString(DateTime.DATETIME_MED);

В разных локалях различаются:

  • 12-часовой и 24-часовой формат
  • Разделитель времени
  • Порядок отображения даты и времени

Например:

DateTime.local(2026, 1, 15, 18, 30)
  .setLocale("en-US")
  .toLocaleString(DateTime.TIME_SIMPLE);
// 6:30 PM

DateTime.local(2026, 1, 15, 18, 30)
  .setLocale("ru")
  .toLocaleString(DateTime.TIME_SIMPLE);
// 18:30

Локаль и разбор строк (парсинг)

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

DateTime.fromFormat("15 января 2026", "d LLLL yyyy", {
  locale: "ru"
});

Здесь LLLL соответствует названию месяца, и именно локаль определяет, что "января" корректно распознаётся как январь.

Без указания локали парсинг может не сработать или дать некорректный результат:

DateTime.fromFormat("15 January 2026", "d LLLL yyyy", {
  locale: "en"
});

Локаль и шаблоны формата

Некоторые токены Luxon зависят от локали:

  • LLL — сокращённое название месяца
  • LLLL — полное название месяца
  • ccc — сокращённый день недели
  • cccc — полный день недели
  • o — порядковый номер дня (ordinal)
DateTime.local(2026, 1, 15)
  .setLocale("en")
  .toFormat("cccc, LLLL d");
// Thursday, January 15

DateTime.local(2026, 1, 15)
  .setLocale("ru")
  .toFormat("cccc, LLLL d");
// четверг, январь 15

Поведение определяется не Luxon напрямую, а локалью Intl.

Наследование локали и цепочки вызовов

Локаль сохраняется при трансформациях объекта:

const base = DateTime.local().setLocale("ru");

const shifted = base.plus({ days: 5 });

shifted.locale; // "ru"

Любые операции (plus, minus, set) возвращают новый объект, сохраняя локаль, если она не была переопределена.

Глобальные настройки и локаль по умолчанию

Помимо defaultLocale, Luxon предоставляет централизованное управление параметрами форматирования:

import { Settings } from "luxon";

Settings.defaultLocale = "en-GB";

Это влияет на:

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

При этом локаль экземпляра имеет приоритет над глобальной настройкой.

Особенности взаимодействия с Intl

Luxon полностью опирается на Intl.DateTimeFormat, поэтому:

  • доступные локали зависят от окружения
  • поведение может отличаться в Node.js и браузере
  • некоторые локали могут быть частично поддержаны

Luxon не нормализует локали, а передаёт их напрямую в движок JavaScript.

Практическая модель работы локали в Luxon

Локаль в Luxon можно рассматривать как слой форматирования поверх неизменяемого временного значения:

  • timestamp — фиксированная точка времени
  • zone — временная зона
  • locale — правила отображения

Эти три компонента независимы:

  • смена локали не меняет время
  • смена зоны не меняет локаль
  • смена формата не влияет на timestamp

Такое разделение позволяет строить предсказуемую модель работы с датами в многоязычных приложениях.