В библиотеке Luxon работа с временными интервалами построена на
концепции неизменяемых объектов. Любая операция модификации даты или
времени не изменяет исходный экземпляр, а возвращает новый объект.
Добавление недель реализуется через метод plus, который
принимает объект длительности (Duration-like object), где неделя
задаётся ключом weeks.
Основной способ увеличить дату на заданное количество недель —
использование метода DateTime.plus():
import { DateTime } from "luxon";
const now = DateTime.now();
const inTwoWeeks = now.plus({ weeks: 2 });
В данном примере создаётся новый объект даты, смещённый на 14 дней вперёд (2 недели × 7 дней).
Ключевой момент: weeks в Luxon интерпретируется
как календарная длительность, равная 7 дням, а не как «рабочие
недели» или «недели календарной сетки с учётом месяца».
Каждое применение plus возвращает новый экземпляр
DateTime:
const base = DateTime.local(2026, 1, 1);
const shifted = base.plus({ weeks: 3 });
console.log(base.toISO()); // исходная дата
console.log(shifted.toISO()); // дата + 21 день
Исходный объект остаётся неизменным, что важно для предсказуемости цепочек операций и функционального стиля работы с датами.
Добавление недель эквивалентно добавлению количества дней, кратного семи:
DateTime.now().plus({ weeks: 1 });
// эквивалентно
DateTime.now().plus({ days: 7 });
Однако использование недель предпочтительнее с точки зрения семантики, поскольку код становится более выразительным и ближе к предметной области.
Для вычитания недель используется либо отрицательное значение в
plus, либо метод minus:
const dt = DateTime.now();
const past1 = dt.minus({ weeks: 1 });
const past2 = dt.plus({ weeks: -1 });
Обе формы эквивалентны, но minus улучшает читаемость при
работе с отрицательными смещениями времени.
Luxon поддерживает дробные значения длительностей, включая недели:
const dt = DateTime.now().plus({ weeks: 1.5 });
В этом случае добавляется 10.5 дней (7 × 1.5). Такой подход полезен при расчётах, связанных с планированием или моделированием временных интервалов.
При добавлении недель учитываются локальные правила часового пояса и переходы на летнее/зимнее время.
const dt = DateTime.fromISO("2026-03-25T10:00", { zone: "Europe/Berlin" });
const shifted = dt.plus({ weeks: 1 });
Если в промежутке происходит сдвиг часового пояса (DST), Luxon корректирует локальное время так, чтобы сохранить абсолютную временную точку.
Это означает:
Важно различать:
weeks — строгое смещение на
7 × N дней;Luxon не интерпретирует weeks как «недели месяца» или
«ISO-недели». Для работы с календарными неделями используются отдельные
механизмы:
DateTime.now().weekNumber;
DateTime.now().weekYear;
Эти свойства позволяют определять текущую ISO-неделю, но не участвуют напрямую в арифметике добавления времени.
Метод plus принимает составные длительности:
const dt = DateTime.now().plus({
weeks: 2,
days: 3,
hours: 5
});
Порядок интерпретации не влияет на результат, так как Luxon нормализует длительность внутри одного вычисления.
Особенность: если одновременно заданы недели и дни, они суммируются:
.plus({ weeks: 1, days: 7 }) // эквивалентно 2 недели
Добавление недель часто используется в цепочках преобразований:
const result = DateTime.now()
.startOf("day")
.plus({ weeks: 4 })
.set({ hour: 12 });
Каждый этап возвращает новый объект, формируя предсказуемую последовательность преобразований.
Добавление недель применяется в типичных сценариях планирования:
Пример расчёта следующего платежа:
const nextPayment = DateTime.fromISO("2026-01-01").plus({ weeks: 2 });
Luxon не выполняет округление при добавлении недель. Все вычисления основаны на точном количестве миллисекунд:
Это исключает накопление ошибок при последовательных операциях.
Добавление недель может пересекать границы календарных периодов:
DateTime.fromISO("2026-12-20").plus({ weeks: 3 });
Luxon корректно пересчитывает дату, не ограничиваясь текущим месяцем или годом. Перенос осуществляется через абсолютную шкалу времени, а не через календарную сетку.
Хотя добавление недель эквивалентно умножению на 7 дней,
использование weeks предпочтительнее:
// предпочтительно
plus({ weeks: 6 })
// менее выразительно
plus({ days: 42 })
После добавления недель результат обычно форматируется:
const dt = DateTime.now().plus({ weeks: 1 });
console.log(dt.toISO());
console.log(dt.toFormat("dd.MM.yyyy"));
Форматирование не влияет на саму операцию добавления, но важно для представления результата.
При работе с UTC поведение упрощается, так как отсутствуют переходы времени:
const dt = DateTime.utc(2026, 1, 1).plus({ weeks: 10 });
В этом случае добавление недель всегда соответствует фиксированному числу миллисекунд без локальных корректировок.
При смене временной зоны до или после добавления недель результат может отличаться по отображению, но не по абсолютному времени:
const dt = DateTime.fromISO("2026-01-01T10:00", { zone: "UTC" })
.plus({ weeks: 1 })
.setZone("Asia/Almaty");
Изменяется только интерпретация локального времени, а не момент в UTC.
Внутри Luxon weeks рассматривается как часть общей
модели Duration:
Эта модель обеспечивает согласованность между всеми единицами измерения времени и делает операции предсказуемыми независимо от контекста использования.