Метод diffNow

Метод diffNow в Luxon предназначен для вычисления разницы между конкретным моментом времени и текущим моментом (now). Он возвращает объект Duration, отражающий расстояние между датой и текущим временем, при этом направление разницы определяется относительно текущего времени.

diffNow является специализированной формой метода diff, где в качестве второго операнда автоматически используется текущее время системы.

Если представить базовую идею:

  • DateTime.diff(other) — разница между двумя датами
  • DateTime.diffNow() — разница между датой и текущим моментом

Результат всегда выражается через Duration, а не через число.

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

DateTime.diffNow(units?, options?)

Параметры

units (опционально) Определяет, в каких единицах будет возвращена разница:

  • строка: "days", "hours", "minutes"
  • массив строк: ["days", "hours", "minutes"]

Если не указано, Luxon возвращает длительность в наиболее подходящей форме или в стандартной конфигурации Duration.

options (опционально) Объект дополнительных настроек:

  • conversionAccuracy — влияет на точность преобразований между единицами (например, при пересчётах месяцев в дни)
  • locale — локаль форматирования Duration (если далее используется форматирование)

Поведение метода

Метод вычисляет выражение:

this - DateTime.now()

Это означает:

  • если дата в будущем → результат положительный
  • если дата в прошлом → результат отрицательный (или с отрицательными полями Duration)

Важно, что результат не является числом, а сохраняет структурированную форму времени.

Работа с единицами измерения

Luxon позволяет явно задавать единицы, что влияет на интерпретацию результата.

Пример одного значения

const dt = DateTime.local().plus({ days: 2 });

const diff = dt.diffNow("days");

Результат будет Duration, где значение приблизительно равно 2.

Несколько единиц

const dt = DateTime.local().plus({ days: 1, hours: 5 });

const diff = dt.diffNow(["days", "hours"]);

В результате Duration будет содержать два поля:

  • days
  • hours

Положительные и отрицательные значения

Ключевая особенность diffNow — зависимость знака результата от положения даты относительно текущего времени.

Будущее

const future = DateTime.local().plus({ hours: 3 });
const d = future.diffNow("hours");

Результат: положительное значение ~3.

Прошлое

const past = DateTime.local().minus({ hours: 3 });
const d = past.diffNow("hours");

Результат: отрицательное значение ~-3.

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

Luxon работает по принципу неизменяемых объектов:

  • исходный DateTime не изменяется
  • создаётся новый Duration
const dt = DateTime.local();
const d = dt.diffNow("minutes");

// dt остаётся неизменным

Влияние часовых поясов

diffNow учитывает временную зону объекта DateTime.

Если объект создан в одной зоне, а now берётся в системной зоне выполнения, Luxon корректно нормализует значения через внутренний UTC-представление.

const dt = DateTime.local().setZone("Europe/Paris");
const diff = dt.diffNow("hours");

Результат корректно отражает реальную разницу времени независимо от локальной системы.

Отличие от diff

Метод diff требует явного указания второй даты:

dt.diff(DateTime.now(), "hours");

diffNow является синтаксическим упрощением:

dt.diffNow("hours");

Оба метода эквивалентны по результату, но diffNow уменьшает количество кода и снижает вероятность ошибок при передаче now.

Примеры использования

Проверка, сколько времени осталось до события

const event = DateTime.local(2026, 12, 31);
const remaining = event.diffNow(["days", "hours"]);

Определение возраста даты относительно текущего момента

const created = DateTime.local().minus({ days: 10 });

const age = created.diffNow("days");

Значение будет отрицательным, что отражает прошедшее время.

Использование в логике таймеров

const deadline = DateTime.local().plus({ minutes: 30 });

setInterval(() => {
  const diff = deadline.diffNow("seconds").seconds;
}, 1000);

Поведение при изменении системного времени

Поскольку now вычисляется в момент вызова метода, любые изменения системных часов между вызовами приведут к изменению результата. diffNow не кэширует значение времени.

Формат результата

Возвращаемый объект Duration может быть:

  • конвертирован в числа через .as("unit")
  • нормализован через .shiftTo(...)
  • форматирован через .toFormat(...)
const diff = dt.diffNow("minutes");

diff.as("minutes");
diff.shiftTo("hours", "minutes");

Особенности округления

Luxon не округляет результат по умолчанию до целого числа при вычислении diffNow. Значения могут быть дробными:

const diff = dt.diffNow("hours");

Результат может быть, например, 2.345.

Для контроля точности используется:

  • conversionAccuracy в options
  • последующее округление через Duration API

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

diffNow часто используется вместе с:

  • plus
  • minus
  • setZone
  • toISO
  • toMillis
const dt = DateTime.now().plus({ days: 5 });

dt.diffNow("days").as("days");

Поведение при отсутствии units

Если единицы не указаны, Luxon возвращает Duration с базовой структурой, которая зависит от внутренних правил разбиения времени. Обычно это эквивалентно наиболее крупным единицам представления (например, дни/часы/минуты вместо секундного представления).