Метод minus

Метод minus в библиотеке Luxon используется для вычитания временных промежутков из объекта DateTime. Он позволяет уменьшать дату и время на заданное количество дней, часов, минут, месяцев и других единиц времени.

Метод не изменяет исходный объект. Вместо этого создаётся новый экземпляр DateTime с обновлённым значением даты.

Сигнатура метода

DateTime.minus(duration)

Метод принимает:

  • объект с единицами времени;
  • экземпляр Duration;
  • число миллисекунд.

Базовое вычитание дней

import { DateTime } from "luxon";

const date = DateTime.now();

const result = date.minus({ days: 5 });

console.log(result.toISO());

Что происходит

Из текущей даты вычитается 5 дней. Если сегодня 2026-05-23, результатом станет 2026-05-18.


Вычитание нескольких единиц времени

Метод поддерживает одновременное вычитание разных временных единиц.

const result = DateTime.now().minus({
  days: 2,
  hours: 4,
  minutes: 30
});

console.log(result.toISO());

Luxon корректно пересчитывает итоговую дату с учётом всех компонентов.


Поддерживаемые единицы времени

Метод minus работает со следующими единицами:

Единица Описание
years годы
quarters кварталы
months месяцы
weeks недели
days дни
hours часы
minutes минуты
seconds секунды
milliseconds миллисекунды

Вычитание месяцев

const date = DateTime.fromISO("2026-05-15");

const result = date.minus({ months: 2 });

console.log(result.toISODate());

Результат:

2026-03-15

Особенности вычитания месяцев

Вычитание месяцев работает календарным образом, а не как фиксированное количество дней.

const date = DateTime.fromISO("2026-03-31");

const result = date.minus({ months: 1 });

console.log(result.toISODate());

Результат:

2026-02-28

Почему так происходит

В феврале нет 31 числа, поэтому Luxon автоматически корректирует дату до последнего валидного дня месяца.

Это важное отличие календарных вычислений от арифметики миллисекунд.


Вычитание лет

const result = DateTime.now().minus({ years: 1 });

console.log(result.toISO());

Метод учитывает:

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

Вычитание времени

Минус часы

const result = DateTime.now().minus({ hours: 6 });

Минус минуты

const result = DateTime.now().minus({ minutes: 45 });

Минус секунды

const result = DateTime.now().minus({ seconds: 30 });

Вычитание недель

const result = DateTime.now().minus({ weeks: 3 });

console.log(result.toISODate());

Неделя интерпретируется как 7 календарных дней.


Использование Duration

Метод minus может принимать объект Duration.

import { DateTime, Duration } from "luxon";

const duration = Duration.fromObject({
  days: 1,
  hours: 2
});

const result = DateTime.now().minus(duration);

console.log(result.toISO());

Когда это полезно

Duration особенно удобен:

  • при повторном использовании интервалов;
  • при сложных вычислениях;
  • при хранении временных шаблонов.

Вычитание миллисекунд

Метод принимает обычное число.

const result = DateTime.now().minus(60000);

console.log(result.toISO());

Результат уменьшится на 60 000 миллисекунд, то есть на 1 минуту.


Иммутабельность

Объекты DateTime являются неизменяемыми.

const original = DateTime.now();

const updated = original.minus({ days: 1 });

console.log(original.toISO());
console.log(updated.toISO());

Важная особенность

original остаётся без изменений.

Это исключает множество ошибок, связанных со случайной модификацией даты.


Цепочки вызовов

Метод удобно комбинируется с другими операциями.

const result = DateTime.now()
  .minus({ days: 7 })
  .startOf("day")
  .toISO();

console.log(result);

Работа с часовыми поясами

Метод сохраняет текущую временную зону объекта.

const date = DateTime.now().setZone("Europe/Berlin");

const result = date.minus({ hours: 3 });

console.log(result.zoneName);

Результат:

Europe/Berlin

Переход через границы суток

const date = DateTime.fromISO("2026-05-10T01:00");

const result = date.minus({ hours: 3 });

console.log(result.toISO());

Результат:

2026-05-09T22:00:00.000

Luxon автоматически переносит дату на предыдущий день.


Переход через границы года

const date = DateTime.fromISO("2026-01-01");

const result = date.minus({ days: 1 });

console.log(result.toISODate());

Результат:

2025-12-31

Вычитание с учётом DST

DST — переход на летнее и зимнее время.

const date = DateTime.fromISO(
  "2026-03-29T03:00",
  { zone: "Europe/Berlin" }
);

const result = date.minus({ hours: 1 });

console.log(result.toISO());

Luxon корректно обрабатывает изменения смещения UTC.


Разница между minus({ hours: 24 }) и minus({ days: 1 })

На первый взгляд операции выглядят одинаково, однако при переходах DST результат может отличаться.

Вычитание суток

date.minus({ days: 1 });

Работает как календарное смещение.

Вычитание 24 часов

date.minus({ hours: 24 });

Работает как точный временной интервал.

Во время перехода на летнее время сутки могут содержать 23 часа, а во время перехода на зимнее — 25 часов.


Использование с Interval

import { DateTime, Interval } from "luxon";

const end = DateTime.now();

const start = end.minus({ days: 30 });

const interval = Interval.fromDateTimes(start, end);

console.log(interval.length("days"));

Практический пример: срок действия токена

const expiresAt = DateTime.now();

const refreshTime = expiresAt.minus({ minutes: 5 });

console.log(refreshTime.toISO());

Обновление токена произойдёт за 5 минут до окончания срока действия.


Практический пример: получение даты неделю назад

function getLastWeekDate() {
  return DateTime.now()
    .minus({ weeks: 1 })
    .toISODate();
}

console.log(getLastWeekDate());

Практический пример: фильтрация старых записей

const limitDate = DateTime.now().minus({ days: 90 });

const filtered = records.filter(item => {
  return DateTime.fromISO(item.createdAt) >= limitDate;
});

Практический пример: дедлайн проекта

const deadline = DateTime.fromISO("2026-06-01");

const warningDate = deadline.minus({ days: 3 });

console.log(warningDate.toISODate());

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

Ошибка: ожидание изменения исходного объекта

Неверно:

const date = DateTime.now();

date.minus({ days: 1 });

console.log(date.toISO());

Дата не изменится.

Правильно

const updated = date.minus({ days: 1 });

Ошибка: смешивание календарных и временных интервалов

minus({ days: 1 })

и

minus({ hours: 24 })

не всегда эквивалентны.

Особенно это важно при:

  • работе с часовыми поясами;
  • логировании;
  • аналитике;
  • расписаниях.

Производительность

Метод minus работает быстро, поскольку:

  • операции выполняются внутри объекта DateTime;
  • Luxon использует оптимизированные механизмы Intl;
  • отсутствует мутация объекта.

Однако при массовых вычислениях в циклах рекомендуется:

  • избегать лишнего создания объектов;
  • переиспользовать Duration;
  • минимизировать преобразования форматов.

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

Нативный JavaScript

const date = new Date();

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

Проблемы подхода:

  • изменение исходного объекта;
  • менее читаемый код;
  • сложная работа с часовыми поясами;
  • ошибки при DST.

Luxon

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

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

  • иммутабельность;
  • декларативность;
  • безопасная работа с датами;
  • удобство поддержки кода.

Комбинирование plus и minus

const result = DateTime.now()
  .plus({ months: 1 })
  .minus({ days: 7 });

console.log(result.toISO());

Такой подход часто используется:

  • в финансовых системах;
  • при расчёте подписок;
  • в календарях;
  • в CRM и ERP-системах.

Проверка результата

const result = DateTime.now().minus({ days: 10 });

console.log(result.isValid);

Свойство isValid позволяет убедиться, что объект даты корректен.


Форматирование после вычитания

const result = DateTime.now()
  .minus({ days: 3 })
  .toFormat("dd.MM.yyyy");

console.log(result);

Результат:

20.05.2026

Краткая схема использования

Вычитание дней

date.minus({ days: 5 });

Вычитание часов

date.minus({ hours: 2 });

Вычитание месяцев

date.minus({ months: 1 });

Вычитание нескольких единиц

date.minus({
  days: 2,
  minutes: 30
});

Вычитание Duration

date.minus(duration);