Метод diff в Luxon используется для вычисления разницы
между двумя моментами времени. Результатом работы метода является объект
типа Duration, который хранит разницу в выбранных единицах
измерения: от миллисекунд до лет.
Ключевая особенность метода заключается в том, что он не возвращает число, а формирует структурированное значение длительности, которое можно далее форматировать, конвертировать и анализировать.
Метод вызывается у экземпляра DateTime:
dt1.diff(dt2, units, options)
Где:
dt1 — исходный момент времени (тот, от которого
считается разница)dt2 — момент времени, с которым сравниваютunits — единицы измерения разницыoptions — дополнительные параметры вычисленияРезультатом всегда является объект Duration:
import { DateTime } from "luxon";
const dt1 = DateTime.local(2026, 1, 10);
const dt2 = DateTime.local(2026, 1, 1);
const diff = dt1.diff(dt2, "days");
diff содержит структуру:
toObject, toISO,
shiftTo, и др.)Luxon поддерживает как одиночные, так и комбинированные единицы.
dt1.diff(dt2, "hours");
dt1.diff(dt2, "minutes");
dt1.diff(dt2, "seconds");
dt1.diff(dt2, "days");
Каждая единица возвращает число в соответствующем масштабе.
Можно передавать массив единиц:
dt1.diff(dt2, ["days", "hours", "minutes"]);
В этом случае результат распределяется по компонентам:
{
days: 2,
hours: 5,
minutes: 30
}
Такой подход полезен для отображения человекочитаемых интервалов.
Метод работает на основе абсолютной временной шкалы UTC внутри Luxon. Независимо от часового пояса входных значений, вычисление производится в унифицированном формате.
Пример:
const dt1 = DateTime.fromISO("2026-01-10T00:00:00+03:00");
const dt2 = DateTime.fromISO("2026-01-09T23:00:00Z");
Несмотря на разные зоны, Luxon приводит значения к UTC перед вычислением.
Результат зависит от порядка аргументов:
dt1.diff(dt2)
означает:
dt1 - dt2
Если поменять аргументы:
dt2.diff(dt1)
результат станет отрицательным.
Пример:
const a = DateTime.local(2026, 1, 10);
const b = DateTime.local(2026, 1, 12);
a.diff(b, "days"); // -2 days
b.diff(a, "days"); // +2 days
По умолчанию Luxon возвращает дробные значения, если выбранная единица не позволяет выразить разницу целым числом.
const dt1 = DateTime.local(2026, 1, 10);
const dt2 = DateTime.local(2026, 1, 9, 12);
const diff = dt1.diff(dt2, "days");
Результат:
1.5 days
optionsМетод поддерживает объект опций:
dt1.diff(dt2, "hours", options);
conversionAccuracyОпция управляет точностью преобразования между единицами.
dt1.diff(dt2, "months", { conversionAccuracy: "longterm" });
Возможные значения:
"casual" — быстрые приближённые вычисления"longterm" — более точные расчёты с учётом календарных
особенностейПри указании массива единиц Luxon распределяет разницу от большей к меньшей единице.
const start = DateTime.local(2026, 1, 1);
const end = DateTime.local(2026, 1, 3, 4, 30);
const diff = end.diff(start, ["days", "hours", "minutes"]);
Результат:
{
days: 2,
hours: 4,
minutes: 30
}
Важно, что перерасчёт происходит иерархически: сначала дни, затем остаток в часах, затем в минутах.
diffNowСуществует специализированная версия:
DateTime.diffNow(units, options)
Он вычисляет разницу между текущим временем и заданным моментом:
const dt = DateTime.local(2026, 1, 1);
const diff = dt.diffNow("days");
Фактически эквивалентно:
DateTime.now().diff(dt, "days");
Объект Duration, возвращаемый diff, можно
преобразовывать.
diff.toObject();
Пример:
{ days: 5, hours: 3 }
diff.toISO();
Результат:
P5DT3H
diff.shiftTo("hours", "minutes");
Позволяет перераспределить длительность в другие единицы без пересчёта исходных дат.
При использовании месяцев и лет необходимо учитывать неоднородность календаря.
const a = DateTime.local(2026, 1, 31);
const b = DateTime.local(2026, 2, 28);
a.diff(b, "months");
Результат зависит от настроек точности и календарных правил, так как длина месяцев различается.
diff и арифметикой датОбычные операции с DateTime возвращают новые даты, а не
интервалы:
dt.plus({ days: 2 });
diff же возвращает длительность, а не момент
времени:
dt1.diff(dt2);
Разделение этих концепций важно:
plus/minus → смещение времениdiff → измерение расстояния между точкамиМетод применяется для:
Отрицательная длительность не является ошибкой.
const diff = earlier.diff(later, "days");
Результат:
-3 days
Такие значения сохраняют корректную математическую интерпретацию направления разницы.
При работе с большими интервалами и календарными единицами возможны нюансы:
conversionAccuracyРезультат diff часто используется в цепочках:
const result = dt1
.diff(dt2, ["days", "hours"])
.shiftTo("hours")
.toObject();
Такая цепочка позволяет гибко менять представление одной и той же длительности без повторных вычислений исходных дат.