Настройки для конкретных объектов

Внутренняя модель работы Luxon строится вокруг неизменяемых объектов. Каждый экземпляр DateTime, Duration или Interval содержит собственный набор параметров, определяющих поведение форматирования, интерпретацию времени и локализацию. Эти параметры могут отличаться от глобальных настроек библиотеки и переопределяются точечно, без влияния на остальные объекты.

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


Часовой пояс как локальная характеристика объекта

Ключевая настройка, влияющая на поведение объекта DateTime, — часовой пояс. Он определяет интерпретацию момента времени и формат вывода.

setZone

Метод setZone создаёт новый объект с изменённым часовым поясом, не изменяя исходный экземпляр.

import { DateTime } from "luxon";

const dt = DateTime.local(2026, 5, 23, 12, 0);

const moscowTime = dt.setZone("Europe/Moscow");
const tokyoTime = dt.setZone("Asia/Tokyo");

Оба объекта ссылаются на один и тот же момент времени, но отображаются в разных зонах.

keepLocalTime

Дополнительный параметр setZone управляет тем, как интерпретируются поля времени:

const shifted = dt.setZone("Asia/Tokyo", { keepLocalTime: true });

При keepLocalTime: true сохраняется «локальное представление» времени, а не абсолютный момент. Это фактически сдвигает timestamp.

Различие моделей:

  • без keepLocalTime — конвертация одного и того же момента;
  • с keepLocalTime — перенос времени как набора полей.

Локаль как часть состояния объекта

Локализация влияет на форматирование дат, названия месяцев, порядок компонентов и правила числового представления.

setLocale

Каждый объект DateTime может иметь собственную локаль:

const dt = DateTime.local();

const ru = dt.setLocale("ru");
const fr = dt.setLocale("fr");

Разные локали влияют только на представление:

ru.toLocaleString(DateTime.DATE_FULL);
fr.toLocaleString(DateTime.DATE_FULL);

При этом сам момент времени остаётся неизменным.


Системы нумерации и календаря на уровне объекта

Luxon поддерживает расширенные настройки отображения даты, включая числовые системы и календари.

numberingSystem

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

const arabic = dt.set({ numberingSystem: "arab" });
const latin = dt.set({ numberingSystem: "latn" });

Это влияет на отображение цифр, но не затрагивает вычисления.

outputCalendar

Календарная система также может быть локально переопределена:

const islamic = dt.set({ outputCalendar: "islamic" });
const persian = dt.set({ outputCalendar: "persian" });

Такая настройка используется только при форматировании и не меняет внутреннюю метку времени.


Универсальный механизм set для частичных изменений

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

const modified = dt.set({
  zone: "Europe/London",
  locale: "en-GB",
  numberingSystem: "latn",
  outputCalendar: "gregory"
});

Важно различать:

  • set() для компонентов даты (год, месяц, день);
  • set() для настроек форматирования и окружения.

Комбинирование этих возможностей позволяет точно контролировать поведение экземпляра без изменения глобального состояния.


Наследование и переопределение глобальных настроек

Luxon имеет глобальные параметры через объект настроек, но каждый экземпляр может их переопределять.

Глобальные настройки:

  • дефолтный часовой пояс;
  • локаль;
  • логика интерпретации входных данных.

Локальные настройки объекта имеют приоритет:

const dt = DateTime.local().setZone("Asia/Tokyo");

Даже если глобальный часовой пояс установлен иначе, конкретный объект сохраняет своё значение.


Поведение неизменяемости и цепочки преобразований

Каждая операция настройки возвращает новый экземпляр, сохраняя оригинал неизменным:

const base = DateTime.local(2026, 5, 23);

const step1 = base.setZone("UTC");
const step2 = step1.setLocale("ru");
const step3 = step2.set({ numberingSystem: "latn" });

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


Настройки объектов Duration

Объекты длительности также поддерживают локализацию, но не имеют часового пояса.

setLocale для Duration

import { Duration } from "luxon";

const dur = Duration.fromObject({ hours: 3, minutes: 45 });

const ruDur = dur.setLocale("ru");
const enDur = dur.setLocale("en");

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

ruDur.toHuman();
enDur.toHuman();

Настройки Interval

Интервалы наследуют настройки от границ (start и end), но могут переопределяться.

import { Interval } from "luxon";

const interval = Interval.fromDateTimes(
  DateTime.local(),
  DateTime.local().plus({ hours: 2 })
);

setLocale для Interval

const localized = interval.setLocale("fr");

Обе точки интервала сохраняют свои настройки времени, но форматирование будет учитывать новую локаль.


Комбинирование настроек в сложных сценариях

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

Пример сочетания:

const dt = DateTime.local(2026, 5, 23, 10, 30);

const configured = dt
  .setZone("America/New_York")
  .setLocale("en-US")
  .set({ numberingSystem: "latn" });

Такой объект:

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

Приоритеты локальных настроек над глобальными

При создании объектов Luxon действует следующая иерархия:

  1. Явно переданные параметры (setZone, setLocale, set).
  2. Параметры, заданные через методы объекта.
  3. Глобальные настройки библиотеки.
  4. Системные значения среды выполнения.

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


Клонирование и перенос контекста

Каждое изменение создаёт новый экземпляр с полным копированием состояния. Это позволяет безопасно переносить настройки между объектами:

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

const copy = base.setZone("Asia/Almaty");

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


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

При преобразовании в строку учитываются все локальные настройки объекта:

dt.toISO();
dt.toLocaleString(DateTime.DATETIME_FULL);
dt.toFormat("DDDD t ZZZZ");

Каждый метод форматирования использует текущий контекст объекта:

  • зона;
  • локаль;
  • календарь;
  • система нумерации.

Разделение вычислений и представления

Внутренне Luxon разделяет:

  • абсолютное время (timestamp);
  • представление (zone, locale, calendar, numberingSystem).

Настройки объекта влияют только на второй слой, не затрагивая первый. Это позволяет:

  • сравнивать разные объекты независимо от зоны;
  • выполнять арифметику дат без потери точности;
  • безопасно переключать представления.
const a = DateTime.local().setZone("UTC");
const b = a.setZone("Asia/Tokyo");

a.equals(b); // true — один момент времени

Частичное переопределение параметров

Метод set допускает точечную модификацию только части настроек:

const dt = DateTime.local();

const modified = dt.set({ locale: "de" });

Остальные параметры остаются неизменными, что делает конфигурацию модульной.


Совмещение нескольких представлений одного объекта

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

const base = DateTime.local();

const views = {
  utc: base.setZone("UTC"),
  tokyo: base.setZone("Asia/Tokyo"),
  moscow: base.setZone("Europe/Moscow")
};

Каждый элемент массива или объекта содержит собственный контекст отображения.


Особенности работы с временными смещениями

При изменении зоны важно учитывать различие между интерпретацией времени и его сдвигом:

  • setZone(zone) — смена отображения;
  • setZone(zone, { keepLocalTime: true }) — перенос локальных компонентов.
const original = DateTime.local(2026, 5, 23, 10, 0);

const interpreted = original.setZone("UTC");
const shifted = original.setZone("UTC", { keepLocalTime: true });

Обе операции приводят к разным результатам, несмотря на одинаковую цель.


Изоляция настроек между объектами

Каждый экземпляр Luxon полностью изолирован:

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

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