В Day.js операции изменения даты строятся вокруг принципа неизменяемости (immutable): каждый вызов методов, модифицирующих дату, возвращает новый объект, не изменяя исходный экземпляр.
Это означает, что любые преобразования можно безопасно цепочить, сохранять промежуточные состояния и переиспользовать исходные значения без риска побочных эффектов.
import dayjs from 'dayjs';
const base = dayjs('2026-01-01');
const result = base.add(5, 'day');
console.log(base.format()); // 2026-01-01T00:00:00+00:00
console.log(result.format()); // 2026-01-06T00:00:00+00:00
Метод add используется для прибавления временного
интервала к дате. Сигнатура метода:
dayjs().add(value, unit)
value — числовое значение (может быть
отрицательным)unit — единица измерения времениDay.js поддерживает следующие основные единицы:
millisecondsecondminutehourdayweekmonthyeardayjs('2026-01-01').add(1, 'day'); // +1 день
dayjs('2026-01-01').add(2, 'week'); // +2 недели
dayjs('2026-01-01').add(3, 'month'); // +3 месяца
dayjs('2026-01-01').add(1, 'year'); // +1 год
Метод add можно комбинировать последовательно:
dayjs('2026-01-01')
.add(1, 'month')
.add(10, 'day')
.add(2, 'hour')
.format();
Каждый вызов работает с результатом предыдущего.
add допускает отрицательные значения, фактически
превращаясь в вычитание:
dayjs('2026-01-10').add(-5, 'day');
Однако в практическом коде предпочтительнее использовать
subtract, так как он повышает читаемость.
Месяцы имеют переменную длину, поэтому добавление месяцев может приводить к «переполнению» даты.
dayjs('2026-01-31').add(1, 'month');
Результат зависит от логики нормализации:
Пример:
dayjs('2026-01-31').add(1, 'month'); // 2026-02-28
Неделя в Day.js эквивалентна 7 дням:
dayjs('2026-01-01').add(1, 'week'); // +7 дней
Важно учитывать, что неделя не зависит от календарных границ месяца.
Метод subtract выполняет обратную операцию — вычитание
временного интервала.
Сигнатура идентична add:
dayjs().subtract(value, unit)
dayjs('2026-01-10').subtract(1, 'day');
dayjs('2026-01-10').subtract(2, 'week');
dayjs('2026-01-10').subtract(3, 'month');
dayjs('2026-01-10').subtract(1, 'year');
dayjs('2026-12-31')
.subtract(1, 'year')
.subtract(2, 'month')
.subtract(10, 'day')
.format();
Следующие выражения идентичны по результату:
dayjs('2026-01-10').subtract(5, 'day');
dayjs('2026-01-10').add(-5, 'day');
Но семантически различаются:
subtract — выражает намерение вычитанияadd(-n) — математическое преобразованиеПри работе с add и subtract важно учитывать
уровень точности:
dayjs().add(1500, 'millisecond');
dayjs().subtract(90, 'minute');
Каждое изменение возвращает новый объект:
const d1 = dayjs('2026-01-01');
const d2 = d1.add(10, 'day');
const d3 = d2.subtract(5, 'day');
d1, d2, d3 — независимые
экземпляры.
Это исключает необходимость клонирования и снижает риск случайного изменения состояния.
const createdAt = dayjs();
const deadline = createdAt.add(14, 'day');
const start = dayjs();
const end = start.add(30, 'minute');
const snapshot = dayjs();
const rollback = snapshot.subtract(3, 'day');
const normalized = dayjs('2026-01-01')
.add(1, 'month')
.subtract(1, 'day')
.add(2, 'hour');
При переходах через:
Day.js автоматически корректирует результат в рамках календарной логики.
dayjs('2024-02-29').add(1, 'year'); // 2025-02-28
Методы add и subtract часто применяются в
вычисляемых цепочках без промежуточных переменных:
const deliveryDate = dayjs()
.add(2, 'day')
.add(4, 'hour')
.subtract(15, 'minute');
Такой подход характерен для построения временных окон, расписаний и TTL-логики.
Значение интервала может быть вычисляемым:
const delay = 3;
const result = dayjs().add(delay * 2, 'day');
dayjs().add(1, 'dates'); // ошибка: неверная единица
Корректно:
dayjs().add(1, 'day');
dayjs('2026-01-31').add(1, 'month');
Результат зависит от календаря, а не арифметики 30/31.
const d = dayjs('2026-01-01');
d.add(5, 'day'); // результат потерян
Корректно:
const d2 = d.add(5, 'day');