В Luxon длительность представляется объектом Duration,
который описывает промежуток времени в абстрактных единицах (часы,
минуты, дни и т.д.), не привязываясь к конкретной дате и часовому поясу.
В отличие от DateTime, этот тип не указывает момент
времени, а моделирует именно продолжительность.
Основная особенность Duration заключается в том, что
одно и то же значение может быть выражено в разных единицах
одновременно, а внутренняя нормализация выполняется только при
необходимости.
Экземпляр Duration хранит набор значений в виде объекта
полей времени:
{
years,
months,
weeks,
days,
hours,
minutes,
seconds,
milliseconds
}
Эти значения доступны через метод:
duration.toObject()
Метод возвращает копию внутренних значений, которые использовались при создании или трансформации объекта.
Состояние валидности является ключевым свойством любого объекта Luxon.
isValid — булево значение, указывающее корректность
длительности.invalid — объект с причиной ошибки, если длительность
некорректна.const d = luxon.Duration.fromObject({ hours: 2 });
d.isValid; // true
Невалидные длительности возникают при передаче некорректных значений или несовместимых параметров при преобразованиях.
Длительность может учитывать локализацию при форматировании.
locale — строка локали ("ru",
"en", "de" и т.д.)numberingSystem — система чисел (например,
"latn")Эти свойства не влияют на математическую природу длительности, но используются при выводе строкового представления.
const d = luxon.Duration.fromObject({ minutes: 5 }).setLocale("ru");
Хотя напрямую поле values не является публичным API,
логически оно отражает структуру длительности. Для работы с ним
используется:
duration.toObject()
Метод возвращает значение длительности в указанной единице.
const d = luxon.Duration.fromObject({ hours: 2 });
d.as("minutes"); // 120
d.as("seconds"); // 7200
Поддерживаемые единицы: years, months,
weeks, days, hours,
minutes, seconds,
milliseconds.
Возвращает значение конкретного поля без преобразования в другие единицы.
const d = luxon.Duration.fromObject({ hours: 2, minutes: 30 });
d.get("hours"); // 2
d.get("minutes"); // 30
В отличие от as, метод не выполняет пересчёт между
единицами.
Возвращает нормализованное представление длительности в виде объекта.
const d = luxon.Duration.fromObject({ minutes: 90 });
d.toObject(); // { minutes: 90 }
После нормализации (например, через normalize) структура
может измениться.
Оба метода возвращают длительность в миллисекундах.
const d = luxon.Duration.fromObject({ seconds: 2 });
d.valueOf(); // 2000
d.toMillis(); // 2000
Эти методы используются при математических операциях сравнения и приведения типов.
Сложение длительностей с автоматическим объединением единиц.
const d1 = luxon.Duration.fromObject({ hours: 1 });
const d2 = luxon.Duration.fromObject({ minutes: 30 });
const result = d1.plus(d2);
result.toObject(); // { hours: 1, minutes: 30 }
При наличии пересекающихся единиц Luxon может выполнять нормализацию.
Вычитание длительности.
const d1 = luxon.Duration.fromObject({ hours: 2 });
const d2 = luxon.Duration.fromObject({ minutes: 30 });
const result = d1.minus(d2);
Результат может содержать отрицательные значения при нехватке единиц.
Инверсия знака длительности.
const d = luxon.Duration.fromObject({ hours: 2 });
const neg = d.negate();
neg.toObject(); // { hours: -2 }
Используется при построении обратных интервалов.
Позволяет трансформировать каждую единицу длительности через функцию.
const d = luxon.Duration.fromObject({ hours: 2, minutes: 30 });
const result = d.mapUnits(value => value * 2);
result.toObject(); // { hours: 4, minutes: 60 }
Метод полезен для масштабирования интервалов времени.
Приводит длительность к «естественному» виду, перераспределяя значения между единицами.
const d = luxon.Duration.fromObject({ minutes: 120 });
const normalized = d.normalize();
normalized.toObject(); // { hours: 2 }
Нормализация выполняется с учётом календарной логики Luxon, поэтому результат зависит от набора единиц.
Переводит длительность в заданные единицы, перераспределяя значения.
const d = luxon.Duration.fromObject({ seconds: 3600 });
const shifted = d.shiftTo("hours");
shifted.toObject(); // { hours: 1 }
Можно указывать несколько единиц:
d.shiftTo("hours", "minutes");
Изменяет конфигурацию длительности без изменения самих значений.
const d = luxon.Duration.fromObject({ hours: 1 });
const updated = d.reconfigure({ locale: "ru" });
Метод используется для изменения параметров отображения.
Формирует человеко-читаемую строку с учётом локали.
const d = luxon.Duration.fromObject({ hours: 1, minutes: 30 });
d.toHuman(); // "1 hour, 30 minutes"
При установленной локали результат адаптируется под язык:
d.setLocale("ru").toHuman(); // "1 час, 30 минут"
Возвращает ISO 8601 представление длительности.
const d = luxon.Duration.fromObject({ hours: 2, minutes: 30 });
d.toISO(); // "PT2H30M"
Формат соответствует стандарту ISO 8601 для интервалов времени.
Представляет длительность как временной интервал, интерпретируемый как время суток.
const d = luxon.Duration.fromObject({ hours: 1, minutes: 15 });
d.toISOTime(); // "01:15:00"
Используется в сценариях, где длительность отображается как время без даты.
Возвращает строковое представление объекта, обычно близкое к ISO.
const d = luxon.Duration.fromObject({ minutes: 90 });
d.toString(); // "PT1H30M" или аналогичный формат
Duration участвует в числовых операциях через приведение к миллисекундам.
const d1 = luxon.Duration.fromObject({ seconds: 10 });
const d2 = luxon.Duration.fromObject({ seconds: 20 });
d1 < d2; // true
Такое поведение возможно благодаря valueOf(),
возвращающему числовое значение.
Duration поддерживает отрицательные интервалы:
const d = luxon.Duration.fromObject({ hours: -1, minutes: 30 });
При операциях сложения и вычитания отрицательные значения распространяются по правилам арифметики длительностей.
Типичный сценарий обработки длительности включает цепочку преобразований:
const d = luxon.Duration
.fromObject({ seconds: 5400 })
.shiftTo("hours", "minutes")
.normalize()
.toHuman();
Каждый этап отвечает за отдельный аспект:
shiftTo — выбор единицnormalize — перераспределение значенийtoHuman — форматирование вывода