Региональные особенности

Luxon опирается на стандартные возможности окружения JavaScript (ICU / Intl), поэтому поведение библиотеки в значительной степени определяется региональными настройками среды выполнения: браузера или Node.js. Это создаёт единый подход к локализации, но одновременно требует понимания ограничений конкретной платформы.


Локаль (locale) и её влияние на форматирование

Локаль определяет правила отображения дат, времени, чисел и текстовых элементов календаря: порядок дня и месяца, названия месяцев, формат 12/24 часа, символы разделителей.

В Luxon локаль задаётся на уровне объекта DateTime или глобально через настройки.

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

import { Settings } from "luxon";

Settings.defaultLocale = "ru";

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


Локаль на уровне экземпляра

import { DateTime } from "luxon";

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

Такой объект будет форматироваться по правилам французской локали независимо от глобальных настроек.


Влияние локали на вывод

Методы форматирования используют Intl.DateTimeFormat:

DateTime.now().setLocale("de").toLocaleString();

Результат зависит от региона:

  • ru → 23.05.2026 14:30
  • en → 5/23/2026, 2:30 PM
  • de → 23.5.2026, 14:30

Региональные форматы даты и времени

Luxon использует предустановленные шаблоны toLocaleString, которые адаптируются под локаль.

Основные форматы

DateTime.now().toLocaleString(DateTime.DATE_SHORT);
DateTime.now().toLocaleString(DateTime.DATETIME_MED);
DateTime.now().toLocaleString(DateTime.TIME_WITH_SECONDS);

Каждый формат автоматически перестраивается под регион:

  • порядок компонентов (день/месяц/год)
  • разделители (. / -)
  • формат времени (24h или 12h)
  • наличие AM/PM

Пример различий

const dt = DateTime.fromISO("2026-05-23T14:30:00");

dt.setLocale("en").toLocaleString(DateTime.DATETIME_MED);
dt.setLocale("ru").toLocaleString(DateTime.DATETIME_MED);

Одинаковая дата отображается в разных региональных формах без изменения исходного значения.


Часовые пояса и региональная привязка

Региональные особенности часто пересекаются с часовыми поясами. Luxon использует IANA Time Zone Database.

Установка часового пояса

DateTime.now().setZone("Europe/Moscow");
DateTime.now().setZone("Asia/Almaty");

Часовой пояс влияет на:

  • локальное время
  • дату перехода через сутки
  • смещение UTC

Глобальный часовой пояс

import { Settings } from "luxon";

Settings.defaultZone = "utc";

Теперь все даты интерпретируются как UTC, если явно не указано иначе.


Влияние региона на отображение времени

Локаль и зона работают независимо:

  • локаль → формат отображения
  • зона → вычисление времени

Пример:

DateTime.fromISO("2026-05-23T14:30:00Z")
  .setZone("Asia/Tokyo")
  .setLocale("ja")
  .toLocaleString(DateTime.DATETIME_FULL);

Форматирование чисел и разделителей

Luxon использует Intl.NumberFormat для региональных различий в:

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

Пример:

DateTime.now().setLocale("fr").toLocaleString();

Во французской локали могут использоваться пробелы вместо запятых в числах времени.


Названия месяцев и дней недели

Региональные настройки определяют отображение календарных элементов:

DateTime.now().setLocale("ru").toFormat("LLLL cccc");

Вывод:

  • LLLL → месяц (январь, февраль…)
  • cccc → день недели (понедельник…)

Разные локали:

  • en → Monday, January
  • ru → понедельник, январь
  • es → lunes, enero

Пользовательские форматы и локаль

Метод toFormat позволяет задавать шаблон, но локаль влияет на текстовые элементы:

DateTime.now()
  .setLocale("it")
  .toFormat("cccc, dd LLLL yyyy");

Числа остаются структурными, но названия месяцев и дней локализуются.


Разбор строк с учётом региона

При парсинге строк локаль критична:

DateTime.fromFormat("23.05.2026", "dd.MM.yyyy", {
  locale: "ru"
});

Ошибочная локаль приводит к неверному разбору:

  • MM.dd.yyyy vs dd.MM.yyyy
  • различия в разделителях

Неделя и первый день недели

Региональные различия затрагивают календарную неделю.

DateTime.now().setLocale("en").weekday;
DateTime.now().setLocale("ru").weekday;

Влияние:

  • в США неделя часто начинается с воскресенья
  • в Европе — с понедельника

Luxon использует правила локали через ICU.


12-часовой и 24-часовой формат

Формат времени зависит от региона:

DateTime.now().setLocale("en-US").toLocaleString(DateTime.TIME_SIMPLE);
DateTime.now().setLocale("ru-RU").toLocaleString(DateTime.TIME_SIMPLE);

Типичные различия:

  • en-US → 2:30 PM
  • ru-RU → 14:30

Поддержка локалей в среде выполнения

Luxon не содержит встроенных переводов. Он полностью зависит от ICU:

Node.js

  • наличие ICU full или small влияет на количество доступных локалей
  • минимальная сборка может ограничить языки

Браузер

  • поддержка зависит от движка (V8, SpiderMonkey, JavaScriptCore)
  • современные браузеры обычно имеют полный набор локалей

Падение на дефолтную локаль

Если локаль недоступна, происходит fallback:

Settings.defaultLocale = "xx-XX";

Результат:

  • используется en или системная локаль
  • ошибки не выбрасываются, но форматирование становится стандартным

Региональные различия в ISO-представлении

ISO строки (toISO) не зависят от локали:

DateTime.now().toISO();

Всегда возвращает:

  • фиксированный формат
  • UTC-ориентированное представление (при необходимости)

Это делает ISO универсальным форматом обмена между регионами.


Календарные различия и локаль

Luxon использует григорианский календарь, но локаль влияет на отображение:

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

Поддержка альтернативных календарей ограничена возможностями Intl API среды.


Относительное время и регион

При использовании toRelative и toRelativeCalendar локаль критична:

DateTime.now().plus({ days: 1 }).toRelative({ locale: "ru" });

Примеры:

  • ru → «завтра»
  • en → «tomorrow»
  • de → «morgen»

Смешение локалей и зон

Реальные приложения часто комбинируют настройки:

DateTime.now()
  .setZone("Asia/Almaty")
  .setLocale("ru")
  .toLocaleString(DateTime.DATETIME_FULL);

Поведение определяется трёхуровневой моделью:

  • зона → вычисление времени
  • локаль → форматирование
  • формат → структура вывода

Поведение при сериализации

При передаче данных между системами региональные настройки не сохраняются:

JSON.stringify(DateTime.now())

В сериализации остаётся только ISO-представление, без локали и зоны отображения.


Ограничения региональной модели Luxon

  • отсутствует собственная система переводов
  • нет встроенных календарей кроме григорианского
  • зависит от ICU окружения
  • локаль не влияет на внутренние вычисления времени
  • форматирование полностью делегировано Intl API

Практические особенности использования в многоязычных системах

Региональные настройки требуют единообразной стратегии:

  • хранение времени в UTC или ISO
  • локаль — только для отображения
  • явное указание зоны при работе с пользователями
  • централизованное управление Settings.defaultLocale и Settings.defaultZone

Поведение в мульти-региональных приложениях

В системах с пользователями из разных стран обычно применяется модель:

  • сервер: UTC + ISO
  • клиент: локаль пользователя
  • UI: динамическое форматирование через setLocale

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