В Luxon объект даты и времени строится вокруг неизменяемой структуры, где каждое преобразование возвращает новый экземпляр. Основная идея заключается в том, что состояние инкапсулирует не только абсолютное время, но и контекст его интерпретации.
Ключевым ядром служит момент времени в виде Unix-таймстампа:
Хотя Luxon скрывает внутреннюю структуру, логически она сводится к сочетанию абсолютного времени и набора метаданных, влияющих на отображение и преобразование.
Одним из ключевых аспектов инспекции является проверка корректности
объекта. Любой DateTime может находиться в валидном или
невалидном состоянии.
Основные свойства:
Типовые причины невалидности:
Пример инспекции:
import { DateTime } from "luxon";
const dt = DateTime.fromISO("2025-02-30");
dt.isValid; // false
dt.invalidReason; // "invalidDate"
dt.invalidExplanation; // "the date is not valid because February 30 does not exist"
Состояние валидности распространяется на все последующие операции: любые преобразования сохраняют невалидность, если исходный объект был некорректен.
Внутреннее состояние включает информацию о временной зоне, которая влияет на интерпретацию timestamp.
Основные элементы:
zone.name) —
идентификатор зоны (например, “UTC”, “Europe/Berlin”)Инспекция зоны:
const dt = DateTime.now().setZone("Europe/Berlin");
dt.zoneName; // "Europe/Berlin"
dt.offset; // смещение в минутах
dt.isInDST; // участие в летнем времени
Зона не изменяет абсолютный момент времени, но полностью меняет его отображение и поведение при форматировании.
Отдельный слой состояния связан с локализацией:
Инспекция локали:
const dt = DateTime.now().setLocale("fr");
dt.locale; // "fr"
dt.toLocaleString(); // форматирование с французскими правилами
Локаль не влияет на внутренний timestamp, но определяет отображаемую форму.
Luxon предоставляет несколько способов инспекции текущего состояния объекта через сериализацию.
dt.toISO();
Отражает состояние с учётом зоны и точности.
dt.toJSON();
Используется для передачи состояния между системами, сохраняя ключевые параметры.
dt.toJSDate();
Возвращает стандартный объект JavaScript, теряя часть контекста Luxon (например, локаль и зону как объектную сущность).
Объекты Luxon не модифицируются после создания. Любая операция порождает новый экземпляр с изменённым состоянием.
Примеры операций, создающих новые состояния:
setZonesetLocaleplus / minussetconst dt1 = DateTime.now();
const dt2 = dt1.setZone("UTC");
dt1 === dt2; // false
Это означает, что инспекция всегда должна рассматривать объект как снимок состояния, а не как изменяемую сущность.
Методы создания формируют начальное состояние с различными источниками данных:
fromISO — парсинг ISO-строкиfromMillis — создание из timestampfromObject — сборка из компонентnow — текущее системное времяКаждый источник формирует различный набор внутренних флагов валидности и контекста.
DateTime.fromMillis(0).toISO(); // 1970-01-01T00:00:00.000Z
DateTime.fromObject({ year: 2024, month: 2, day: 30 }).isValid; // false
Для анализа состояния часто используются методы форматирования:
toString() — диагностическое представлениеtoFormat() — кастомное форматированиеtoLocaleString() — локализованное отображениеconst dt = DateTime.now();
dt.toString();
// например: "2026-01-24T10:15:30.000+03:00"
Строковое представление отражает сразу несколько аспектов состояния: timestamp, зону и смещение.
Luxon поддерживает альтернативные календари, которые становятся частью внутреннего состояния:
const dt = DateTime.now().reconfigure({
outputCalendar: "buddhist"
});
dt.outputCalendar;
Календарная система влияет на отображение года, месяца и дня, но не изменяет базовый timestamp.
Помимо DateTime, инспекция распространяется на другие
сущности:
const dur = Duration.fromObject({ hours: 2, minutes: 30 });
dur.as("minutes"); // 150
dur.isValid;
Состояние длительности хранит нормализованные единицы и может быть валидным или невалидным при некорректных значениях.
const i = Interval.fromDateTimes(dt1, dt2);
i.isValid;
i.length("hours");
Интервал включает два DateTime, и его состояние зависит
от корректности границ.
Невалидные объекты формируют отдельный класс состояния, в котором все операции становятся предсказуемо ограниченными.
Типовые сценарии:
Диагностические поля позволяют локализовать проблему без необходимости анализа стека выполнения.
const dt = DateTime.fromFormat("99-99-9999", "dd-MM-yyyy");
dt.isValid; // false
dt.invalidReason;
dt.invalidExplanation;
Каждая операция формирует новую версию состояния, сохраняя предыдущее неизменным:
const dt = DateTime.now()
.setZone("UTC")
.setLocale("de")
.plus({ days: 1 });
На каждом этапе изменяется только часть состояния:
Внутреннее состояние DateTime можно концептуально разложить на слои:
Такое разделение позволяет анализировать поведение объекта независимо от конкретного метода его создания или преобразования.