Библиотека Luxon построена на принципе иммутабельности
объектов времени. Это означает, что любой объект
DateTime, Duration или Interval
не изменяется после создания. Любая операция над ним возвращает новый
экземпляр, а исходный объект остаётся неизменным.
Такой подход напрямую определяет модель «клонирования»: в большинстве
случаев отдельный механизм clone() не требуется, поскольку
каждая модификация уже является формой копирования.
Ключевая особенность:
Объект DateTime не имеет универсального метода глубокого
клонирования. Вместо этого используются операции, которые возвращают
новый экземпляр с изменёнными параметрами.
const dt1 = DateTime.now();
const dt2 = dt1.set({ hour: 10 });
Здесь dt2 — новый объект, а dt1 остаётся
неизменным.
setМетод set создаёт модифицированную копию:
const original = DateTime.local(2024, 5, 10, 12, 0);
const copy = original.set({
hour: 18,
minute: 30
});
Особенность:
DateTimeИзменение временной зоны также является формой клонирования:
const utc = DateTime.utc();
const msk = utc.setZone('Europe/Moscow');
setZone:
DateTimereconfigureПри необходимости изменить конфигурацию объекта (например, зональность или локаль) используется:
const dt = DateTime.local();
const adjusted = dt.reconfigure({
zone: 'utc',
locale: 'ru'
});
Это также создаёт новый экземпляр, фактически выполняя «копирование с настройками».
Если требуется получить независимую копию без изменений состояния, используется сериализация:
const dt1 = DateTime.local(2024, 5, 10, 12, 0);
const dt2 = DateTime.fromObject(dt1.toObject());
Механизм:
toObject() извлекает структурированные поляfromObject() создаёт новый экземплярЕщё один универсальный способ:
const dt1 = DateTime.local();
const dt2 = DateTime.fromISO(dt1.toISO());
Особенности:
Объект Duration также неизменяем.
Любая операция возвращает новый экземпляр:
const d1 = Duration.fromObject({ hours: 2 });
const d2 = d1.plus({ minutes: 30 });
Здесь d2 — копия с изменением, а d1
остаётся неизменным.
toObjectconst d1 = Duration.fromObject({ hours: 5, minutes: 15 });
const d2 = Duration.fromObject(d1.toObject());
Механизм аналогичен DateTime:
Иногда требуется «пересборка» длительности:
const d1 = Duration.fromObject({ minutes: 120 });
const d2 = Duration.fromMillis(d1.as('milliseconds'));
Такой подход полезен при:
cloneВ отличие от DateTime, объект Interval
предоставляет явный метод копирования.
const interval1 = Interval.fromDateTimes(
DateTime.local(2024, 1, 1),
DateTime.local(2024, 1, 10)
);
const interval2 = interval1.clone();
cloneМетод:
IntervalDateTimeВажно:
DateTime также являются неизменяемымиconst interval1 = Interval.fromDateTimes(start, end);
const interval2 = Interval.fromDateTimes(
interval1.start,
interval1.end
);
Такой вариант эквивалентен clone(), но более явный.
Хотя Luxon минимизирует необходимость глубокого копирования, в некоторых случаях требуется полная реконструкция объектов.
const original = DateTime.local();
const copy = DateTime.fromObject(original.toObject());
const original = Duration.fromObject({ hours: 3 });
const copy = Duration.fromObject(original.toObject());
const original = Interval.fromDateTimes(start, end);
const copy = Interval.fromDateTimes(
DateTime.fromISO(original.start.toISO()),
DateTime.fromISO(original.end.toISO())
);
Архитектура библиотеки исключает необходимость универсального клонирования:
Фактически, clone как отдельная концепция избыточен для
DateTime.
Каждая операция создаёт новый объект, что позволяет строить цепочки:
const result = DateTime.local()
.set({ hour: 8 })
.plus({ days: 1 })
.setZone('utc');
Каждый шаг:
DateTimeconst snapshot = DateTime.now();
Любая дальнейшая модификация не влияет на snapshot.
const base = DateTime.local(2024, 1, 1);
const modified = base
.set({ month: 6 })
.plus({ days: 10 });
const base = DateTime.local();
const branch1 = base.plus({ hours: 1 });
const branch2 = base.plus({ hours: 2 });
const dt1 = DateTime.local();
dt1.hour = 10; // не работает
Объект остаётся неизменным, изменение игнорируется.
const copy = { ...DateTime.local() };
Такой подход:
DateTimeВся система копирования сводится к трём принципам:
Каждый тип объекта реализует собственный способ создания независимых экземпляров, при этом сохраняя единый подход: любой «клон» — это всегда новый объект, полученный через трансформацию или сборку из данных.