Внутренняя модель работы Luxon строится вокруг неизменяемых объектов.
Каждый экземпляр DateTime, Duration или
Interval содержит собственный набор параметров,
определяющих поведение форматирования, интерпретацию времени и
локализацию. Эти параметры могут отличаться от глобальных настроек
библиотеки и переопределяются точечно, без влияния на остальные
объекты.
Такой подход позволяет одновременно работать с разными часовыми поясами, локалями и календарными системами в пределах одной программы, сохраняя предсказуемость вычислений.
Ключевая настройка, влияющая на поведение объекта
DateTime, — часовой пояс. Он определяет интерпретацию
момента времени и формат вывода.
Метод 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");
Оба объекта ссылаются на один и тот же момент времени, но отображаются в разных зонах.
Дополнительный параметр setZone управляет тем, как
интерпретируются поля времени:
const shifted = dt.setZone("Asia/Tokyo", { keepLocalTime: true });
При keepLocalTime: true сохраняется «локальное
представление» времени, а не абсолютный момент. Это фактически сдвигает
timestamp.
Различие моделей:
keepLocalTime — конвертация одного и того же
момента;keepLocalTime — перенос времени как набора
полей.Локализация влияет на форматирование дат, названия месяцев, порядок компонентов и правила числового представления.
Каждый объект 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 поддерживает расширенные настройки отображения даты, включая числовые системы и календари.
Каждый экземпляр может использовать собственную систему нумерации:
const arabic = dt.set({ numberingSystem: "arab" });
const latin = dt.set({ numberingSystem: "latn" });
Это влияет на отображение цифр, но не затрагивает вычисления.
Календарная система также может быть локально переопределена:
const islamic = dt.set({ outputCalendar: "islamic" });
const persian = dt.set({ outputCalendar: "persian" });
Такая настройка используется только при форматировании и не меняет внутреннюю метку времени.
Метод 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" });
Цепочки позволяют строить разные представления одного момента без промежуточных побочных эффектов.
Объекты длительности также поддерживают локализацию, но не имеют часового пояса.
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();
Интервалы наследуют настройки от границ (start и
end), но могут переопределяться.
import { Interval } from "luxon";
const interval = Interval.fromDateTimes(
DateTime.local(),
DateTime.local().plus({ hours: 2 })
);
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 действует следующая иерархия:
setZone,
setLocale, set).Это обеспечивает детерминированность поведения даже в сложных приложениях с несколькими источниками конфигурации.
Каждое изменение создаёт новый экземпляр с полным копированием состояния. Это позволяет безопасно переносить настройки между объектами:
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 разделяет:
Настройки объекта влияют только на второй слой, не затрагивая первый. Это позволяет:
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 полностью изолирован:
Это позволяет строить сложные системы расписаний, мультизонных календарей и локализованных интерфейсов без глобальных побочных эффектов.