В библиотеке Luxon объект Duration представляет собой строго типизированное описание временного интервала. В отличие от обычных числовых смещений (миллисекунды), Duration хранит семантические единицы времени: годы, месяцы, дни, часы, минуты, секунды и миллисекунды. Это делает его ключевым инструментом при работе с календарной арифметикой.
В контексте API Luxon Duration часто используется не как самостоятельная сущность, а как аргумент в методах работы с датами и другими длительностями.
Основная идея использования Duration как аргумента заключается в передаче не «сырого числа», а структурированного временного интервала.
Типичные сценарии:
Наиболее важное место применения Duration — методы plus
и minus.
Метод принимает объект Duration или его эквивалентное описание:
import { DateTime, Duration } from "luxon";
const dt = DateTime.local(2026, 1, 1);
const dur = Duration.fromObject({
days: 10,
hours: 5
});
const result = dt.plus(dur);
Логика работы:
Работает симметрично plus, но выполняет обратное
смещение:
const dur = Duration.fromObject({
weeks: 2,
minutes: 30
});
const result = DateTime.now().minus(dur);
Особенность:
Luxon допускает передачу не только экземпляра Duration, но и «duration-like» объекта.
Пример:
DateTime.local().plus({ hours: 3, minutes: 15 });
В этом случае происходит автоматическая конвертация в Duration внутри метода. Фактически создаётся промежуточный объект:
Duration.fromObject({ hours: 3, minutes: 15 });
Такой подход позволяет:
Duration может использоваться как промежуточный аргумент в цепочках преобразований:
const result = DateTime.local()
.plus(Duration.fromObject({ days: 1 }))
.minus(Duration.fromObject({ hours: 2 }))
.plus({ minutes: 45 });
Механика:
Метод diff возвращает Duration, но также может принимать
Duration как параметр для нормализации результата.
const a = DateTime.local(2026, 1, 1);
const b = DateTime.local(2026, 1, 10);
const diff = b.diff(a);
Результат — Duration, который затем может быть снова использован как аргумент:
const normalized = a.plus(diff);
Это создаёт замкнутый цикл преобразований:
Duration часто используется как унифицированный аргумент в прикладных функциях:
function scheduleEvent(start, duration) {
return start.plus(duration);
}
const start = DateTime.local(2026, 5, 23);
const result = scheduleEvent(
start,
Duration.fromObject({ hours: 2, minutes: 30 })
);
Преимущество такого подхода:
Перед использованием в качестве аргумента Duration часто приводится к канонической форме:
const dur = Duration.fromObject({
hours: 25,
minutes: 120
}).normalize();
После нормализации:
При передаче в plus или minus это снижает
риск неоднозначных интерпретаций.
При передаче Duration в методы DateTime существуют важные особенности:
Календарная неоднозначность
Различие между фиксированным и календарным временем
Приоритет единиц
В некоторых случаях Duration преобразуется перед использованием:
const ms = Duration.fromObject({ seconds: 90 }).as("milliseconds");
И затем используется как аргумент:
setTimeout(() => {}, ms);
Хотя это уже не календарная арифметика, а числовое представление, логика построена на одном объекте Duration как источнике данных.
Duration может использоваться как часть более сложных вычислений:
const base = Duration.fromObject({ days: 1 });
const extra = Duration.fromObject({ hours: 5 });
const total = base.plus(extra);
После этого результат может быть применён:
DateTime.local().plus(total);
Такая модель позволяет строить многоуровневые временные выражения без потери структуры.
При передаче Duration в методы DateTime происходит строгая типизация логики:
const dt = DateTime.local();
const shifted = dt.plus(
Duration.fromObject({ months: 1, days: 10 })
);
Здесь месяцы и дни обрабатываются раздельно, что критично для календарной точности.
При проектировании API Duration часто применяется как универсальный аргумент:
function extendSubscription(user, period) {
return {
...user,
expiresAt: user.expiresAt.plus(period)
};
}
В таком контексте Duration: