Метод plus

Метод 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 автоматически учитывает подобные изменения.


Добавление времени к UTC-дате

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());

Ошибки при использовании plus

Неправильные названия единиц

dt.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());

Сравнение с нативным Date

JavaScript Date

const date = new Date();

date.setDate(date.getDate() + 5);

console.log(date);

Недостатки:

  • изменяет исходный объект;
  • менее удобный API;
  • сложнее работа с часовыми поясами;
  • сложнее комбинировать единицы времени.

Luxon

const result = DateTime.now()
  .plus({ days: 5 });

console.log(result.toISO());

Преимущества:

  • неизменяемость;
  • читаемость;
  • удобное комбинирование единиц;
  • корректная работа с зонами и DST;
  • единообразный API.

Комбинирование с другими методами

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 корректно обрабатывает крупные временные промежутки и переходы между календарными системами.