Интервал в Luxon представляет собой объект, описывающий промежуток времени между двумя моментами. В отличие от DateTime, который фиксирует конкретную точку на временной шкале, Interval работает с диапазоном и предоставляет инструменты для анализа, сравнения и трансформации временных отрезков.
Основная концепция Interval заключается в наличии двух границ: начала и конца. Эти границы всегда выражаются через объекты DateTime. Важно учитывать, что Interval не хранит длительность как отдельное число — он вычисляет её на основе разницы между start и end.
Свойство start представляет начало интервала и является
экземпляром DateTime.
import { Interval, DateTime } from "luxon";
const start = DateTime.local(2026, 1, 1);
const end = DateTime.local(2026, 1, 10);
const interval = Interval.fromDateTimes(start, end);
console.log(interval.start.toISO());
Ключевые особенности start:
При работе с start важно учитывать, что любые изменения
требуют создания нового DateTime, так как сам Interval не модифицирует
внутренние значения.
Свойство end задаёт конечную границу интервала и также
является DateTime.
console.log(interval.end.toISO());
Особенности end:
start (нулевой интервал)start для корректного
непустого интервалаЕсли end отсутствует или меньше start,
Interval считается пустым. Это влияет на результаты всех методов
анализа.
Свойство isValid показывает, является ли интервал
корректным.
console.log(interval.isValid);
Поведение isValid:
true — если start и end заданы корректно и start ≤
endfalse — если один из DateTime некорректен или end <
startЭто свойство критично при работе с динамическими датами, особенно при построении интервалов из пользовательского ввода или внешних источников данных.
Если интервал некорректен, свойство invalidReason
содержит текстовую причину.
const bad = Interval.fromDateTimes(end, start);
console.log(bad.invalidReason);
Типичные значения:
Это позволяет быстро диагностировать проблемы при создании временных диапазонов.
Свойство invalidExplanation предоставляет расширенное
описание ошибки.
console.log(bad.invalidExplanation);
В отличие от invalidReason, это более развернутая
информация, включающая контекст, полезный для логирования и отладки.
Хотя Interval имеет ограниченный набор собственных полей, его поведение во многом определяется вычисляемыми характеристиками, основанными на start и end.
Длительность не хранится явно, но может быть получена через метод
toDuration():
const duration = interval.toDuration("days");
console.log(duration.days);
Важно понимать, что:
Interval не копирует DateTime в примитивном виде. Вместо этого он хранит ссылки на неизменяемые объекты DateTime. Это обеспечивает:
Однако это также означает, что логика работы Interval строго зависит от корректности исходных DateTime.
Если start равен end, интервал считается
пустым:
const empty = Interval.fromDateTimes(
DateTime.local(2026, 1, 1),
DateTime.local(2026, 1, 1)
);
console.log(empty.isEmpty());
Пустой интервал:
Если end меньше start, Interval становится
невалидным:
const invalid = Interval.fromDateTimes(
DateTime.local(2026, 1, 10),
DateTime.local(2026, 1, 1)
);
console.log(invalid.isValid);
Такое состояние не допускается для операций пересечения и объединения.
Все свойства Interval являются неизменяемыми. Это означает:
start и end нельзя изменить напрямуюconst shifted = interval.set({
start: interval.start.plus({ days: 1 })
});
Даже в этом случае создаётся новый экземпляр, а исходный Interval не изменяется.
Связь между start и end определяет поведение всех операций Interval:
Эта модель делает Interval предсказуемым инструментом для работы с временными диапазонами, где границы имеют первостепенное значение.
При построении систем расписаний, бронирований или временных фильтров свойства start и end используются как базовые координаты:
Такой подход позволяет избегать хранения избыточных данных, оставляя только минимально необходимую структуру интервала.