Метод plus() в библиотеке Luxon
используется для добавления временного интервала к объекту
DateTime. С его помощью можно прибавлять дни, месяцы, часы,
минуты, секунды и другие единицы времени, получая новый экземпляр
даты.
Объекты DateTime в Luxon являются
неизменяемыми (immutable). Метод plus() не изменяет
исходный объект, а возвращает новый.
Базовый синтаксис:
dateTime.plus(duration)
duration — объект с единицами времени.
Пример:
import { DateTime } from "luxon";
const now = DateTime.now();
const tomorrow = now.plus({ days: 1 });
console.log(now.toISO());
console.log(tomorrow.toISO());
Самый распространённый сценарий — прибавление дней.
const date = DateTime.fromISO("2025-01-10");
const result = date.plus({ days: 5 });
console.log(result.toISODate());
Результат:
2025-01-15
Можно использовать отрицательные значения:
const result = date.plus({ days: -3 });
console.log(result.toISODate());
Результат:
2025-01-07
Метод корректно обрабатывает длину месяцев и переходы между годами.
const date = DateTime.fromISO("2025-11-15");
const result = date.plus({ months: 3 });
console.log(result.toISODate());
Результат:
2026-02-15
При добавлении месяцев могут возникать ситуации с отсутствующими датами.
const date = DateTime.fromISO("2025-01-31");
const result = date.plus({ months: 1 });
console.log(result.toISODate());
Результат:
2025-02-28
Luxon автоматически корректирует дату до максимально
возможной.
const date = DateTime.fromISO("2020-02-29");
const result = date.plus({ years: 1 });
console.log(result.toISODate());
Результат:
2021-02-28
Поскольку 2021 год не високосный, дата корректируется.
const now = DateTime.now();
const future = now.plus({
hours: 2,
minutes: 30
});
console.log(future.toISO());
Можно комбинировать разные единицы времени в одном вызове.
const dt = DateTime.now();
const result = dt.plus({
seconds: 45,
milliseconds: 500
});
console.log(result.toISO());
Метод plus() поддерживает:
| Единица | Ключ |
|---|---|
| Годы | years |
| Кварталы | quarters |
| Месяцы | months |
| Недели | weeks |
| Дни | days |
| Часы | hours |
| Минуты | minutes |
| Секунды | seconds |
| Миллисекунды | milliseconds |
Пример использования нескольких единиц:
const dt = DateTime.now();
const result = dt.plus({
years: 1,
months: 2,
weeks: 1,
days: 3,
hours: 5
});
console.log(result.toISO());
DurationМетод plus() может принимать не только обычный объект,
но и экземпляр Duration.
import { DateTime, Duration } from "luxon";
const duration = Duration.fromObject({
days: 2,
hours: 6
});
const dt = DateTime.now();
const result = dt.plus(duration);
console.log(result.toISO());
const date = DateTime.fromISO("2025-03-01");
const result = date.plus({ weeks: 2 });
console.log(result.toISODate());
Результат:
2025-03-15
Квартал равен трём месяцам.
const date = DateTime.fromISO("2025-01-10");
const result = date.plus({ quarters: 1 });
console.log(result.toISODate());
Результат:
2025-04-10
Поскольку plus() возвращает новый объект
DateTime, методы можно объединять в цепочки.
const result = DateTime.now()
.plus({ days: 1 })
.plus({ hours: 3 })
.set({ minute: 0 });
console.log(result.toISO());
plus() и
set()Метод plus() добавляет интервал времени.
const dt = DateTime.fromISO("2025-05-10");
console.log(
dt.plus({ days: 1 }).toISODate()
);
Результат:
2025-05-11
Метод set() заменяет конкретное значение.
console.log(
dt.set({ day: 1 }).toISODate()
);
Результат:
2025-05-01
Метод учитывает текущую временную зону объекта
DateTime.
const dt = DateTime.now().setZone("Europe/Berlin");
const result = dt.plus({ hours: 5 });
console.log(result.toString());
Одной из важных особенностей Luxon является корректная
работа с DST (Daylight Saving Time).
const dt = DateTime.fromISO(
"2025-03-30T01:30",
{ zone: "Europe/Berlin" }
);
const result = dt.plus({ hours: 1 });
console.log(result.toString());
Во время перехода на летнее время некоторые часы могут отсутствовать.
Luxon автоматически учитывает подобные изменения.
const utcDate = DateTime.utc(2025, 5, 10, 12);
const result = utcDate.plus({ hours: 10 });
console.log(result.toISO());
IntervalМетод plus() часто применяется при работе с временными
интервалами.
import { DateTime, Interval } from "luxon";
const start = DateTime.now();
const end = start.plus({ days: 7 });
const interval = Interval.fromDateTimes(start, end);
console.log(interval.toString());
let current = DateTime.fromISO("2025-01-01");
for (let i = 0; i < 5; i++) {
current = current.plus({ days: 1 });
console.log(current.toISODate());
}
Результат:
2025-01-02
2025-01-03
2025-01-04
2025-01-05
2025-01-06
const start = DateTime.fromISO("2025-06-01");
const dates = [];
for (let i = 0; i < 12; i++) {
dates.push(
start.plus({ months: i }).toISODate()
);
}
console.log(dates);
function addBusinessDays(date, days) {
let result = date;
while (days > 0) {
result = result.plus({ days: 1 });
if (result.weekday < 6) {
days--;
}
}
return result;
}
const dt = DateTime.fromISO("2025-05-09");
const result = addBusinessDays(dt, 3);
console.log(result.toISODate());
plusdt.plus({ day: 1 });
Неверно:
day
Правильно:
days
const dt = DateTime.now();
dt.plus({ days: 1 });
console.log(dt.toISO());
Исходная дата останется прежней.
Правильный подход:
const updated = dt.plus({ days: 1 });
Метод plus() создаёт новый объект DateTime
при каждом вызове.
В обычных приложениях это практически незаметно, однако при массовых вычислениях желательно избегать лишних операций:
let dt = DateTime.now();
for (let i = 0; i < 100000; i++) {
dt = dt.plus({ days: 1 });
}
const expiresAt = DateTime.now()
.plus({ hours: 2 });
console.log(expiresAt.toISO());
const deadline = DateTime.now()
.plus({ days: 14 });
console.log(deadline.toISODate());
const nextPayment = DateTime.now()
.plus({ months: 1 });
console.log(nextPayment.toISODate());
const finish = DateTime.now()
.plus({ minutes: 10 });
console.log(finish.toISO());
DateDateconst date = new Date();
date.setDate(date.getDate() + 5);
console.log(date);
Недостатки:
const result = DateTime.now()
.plus({ days: 5 });
console.log(result.toISO());
Преимущества:
minus()const dt = DateTime.now();
const result = dt
.plus({ days: 10 })
.minus({ hours: 5 });
console.log(result.toISO());
startOf()const result = DateTime.now()
.plus({ months: 1 })
.startOf("month");
console.log(result.toISO());
endOf()const result = DateTime.now()
.plus({ weeks: 1 })
.endOf("week");
console.log(result.toISO());
Luxon допускает использование дробных чисел.
const dt = DateTime.now();
const result = dt.plus({
hours: 1.5
});
console.log(result.toISO());
Результат эквивалентен добавлению 1 часа и 30 минут.
const dt = DateTime.now();
const result = dt.plus({
years: 100,
months: 6,
days: 20
});
console.log(result.toISO());
Luxon корректно обрабатывает крупные временные
промежутки и переходы между календарными системами.