Метод 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()
Это означает:
Важно, что результат не является числом, а сохраняет структурированную форму времени.
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 будет содержать два поля:
Ключевая особенность 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 не изменяетсяDurationconst 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 требует явного указания второй даты:
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 в optionsDuration APIdiffNow часто используется вместе с:
plusminussetZonetoISOtoMillisconst dt = DateTime.now().plus({ days: 5 });
dt.diffNow("days").as("days");
Если единицы не указаны, Luxon возвращает Duration с базовой структурой, которая зависит от внутренних правил разбиения времени. Обычно это эквивалентно наиболее крупным единицам представления (например, дни/часы/минуты вместо секундного представления).