Luxon предоставляет глобальный объект настроек Settings,
через который управляется поведение всей библиотеки в отношении
временных зон, локали и формата по умолчанию. Одним из ключевых
параметров является Settings.defaultZone, определяющий зону
времени, которая будет использоваться при создании объектов
DateTime, если зона не указана явно.
Settings.defaultZone влияет на то, как интерпретируются
и создаются все «локальные» моменты времени. Внутри Luxon каждая дата и
время привязаны к зоне (Zone). Если разработчик не задаёт
зону явно, библиотека обращается к
Settings.defaultZone.
По умолчанию используется системная зона окружения
(SystemZone), которая соответствует настройкам операционной
системы или среды выполнения (браузер, Node.js).
В Luxon временная зона — это не просто строка, а полноценный объект,
реализующий интерфейс Zone. Он определяет:
Основные типы зон:
SystemZone);FixedOffsetZone с нулевым смещением);America/New_York, Europe/Paris
и т.д.);+03:00,
-05:00).Settings.defaultZone задаёт, какая из этих зон будет
использоваться по умолчанию.
При создании времени без указания зоны:
import { DateTime } from "luxon";
const dt = DateTime.now();
Luxon использует Settings.defaultZone.
Если значение не переопределено, результат эквивалентен:
DateTime.now().setZone(Settings.defaultZone);
Одним из наиболее распространённых сценариев является перевод всей логики приложения в UTC:
import { Settings, DateTime, Zone } from "luxon";
Settings.defaultZone = Zone.create("utc");
После этого все новые DateTime, созданные без явной
зоны, будут интерпретироваться как UTC-время.
Эквивалентное поведение затрагивает:
DateTime.now()DateTime.local()Можно задать конкретную временную зону:
Settings.defaultZone = Zone.create("Europe/Berlin");
Теперь все локальные даты будут интерпретироваться в контексте Берлина, независимо от системных настроек сервера или клиента.
Это особенно важно для:
Функции:
DateTime.local()
DateTime.now()
не задают зону явно и полностью зависят от
defaultZone.
Например:
Settings.defaultZone = Zone.create("utc");
const a = DateTime.now();
const b = DateTime.local(2026, 1, 1);
Обе даты будут созданы в UTC, а не в системной зоне.
При разборе строк без явного указания временной зоны:
DateTime.fromISO("2026-01-01T10:00");
Luxon применяет Settings.defaultZone.
Если defaultZone = UTC, то время будет интерпретировано
как UTC-время. Если установлена региональная зона — как локальное время
этой зоны.
Это поведение критично, так как отсутствие зоны в ISO-строке не означает отсутствие смысла — интерпретация всегда зависит от контекста.
Settings.defaultZone — глобальный параметр. Это
означает:
DateTime используют новое
значение;Пример:
Settings.defaultZone = Zone.create("utc");
const a = DateTime.now();
Settings.defaultZone = Zone.create("Asia/Tokyo");
const b = DateTime.now();
a и b будут в разных зонах, несмотря на
одинаковый вызов метода.
В Node.js изменение Settings.defaultZone особенно
чувствительно, так как:
Типичный риск:
Поэтому изменение defaultZone обычно выполняется один
раз при инициализации приложения.
При модульных тестах глобальная природа
Settings.defaultZone может приводить к утечкам состояния
между тестами.
Практика:
const originalZone = Settings.defaultZone;
beforeEach(() => {
Settings.defaultZone = Zone.create("utc");
});
afterAll(() => {
Settings.defaultZone = originalZone;
});
Это обеспечивает воспроизводимость результатов.
Settings.defaultZone не заменяет явное указание
зоны:
DateTime.now().setZone("America/New_York");
Явная зона всегда имеет приоритет над defaultZone.
Иерархия:
setZone(...) на конкретном DateTimeSettings.defaultZoneSettings.defaultZone = Zone.create("utc");
const dt = DateTime.local(12, 0);
Результат будет в UTC, а не в локальном времени пользователя.
Изменение defaultZone в середине работы приложения может
привести к:
При установке фиксированной зоны теряется связь с окружением:
Используется в распределённых системах:
Приложение может работать в «виртуальной зоне»:
Europe/Moscow;Фиксация зоны упрощает проверку:
При обращении к DateTime.now() Luxon:
Settings.defaultZone;DateTime с привязкой к этой зоне;Таким образом, defaultZone не влияет на «момент
времени», а только на его интерпретацию.
При преобразовании в ISO:
DateTime.now().toISO();
зона влияет на:
Z, +03:00);Settings.defaultZone часто становится частью
архитектурного решения:
Неправильная настройка приводит к расхождению между: