В библиотеке Luxon интервал (Interval) представляет
собой непрерывный промежуток времени между двумя моментами — началом и
концом. В отличие от отдельных объектов DateTime, интервал
описывает не точку, а диапазон, что делает его удобным для моделирования
расписаний, бронирований, периодов активности и любых временных
отрезков.
Ключевая особенность интервала заключается в строгой зависимости от двух границ:
DateTime)DateTime)Любой интервал в Luxon строится вокруг этих двух значений.
fromDateTimesНаиболее прямой способ создания интервала — использование метода
Interval.fromDateTimes.
import { DateTime, Interval } from "luxon";
const start = DateTime.local(2026, 1, 1, 10, 0);
const end = DateTime.local(2026, 1, 1, 12, 0);
const interval = Interval.fromDateTimes(start, end);
В этом случае:
DateTimeЕсли end меньше start, интервал считается
некорректным:
const invalid = Interval.fromDateTimes(end, start);
Такой интервал будет помечен как невалидный, и любые операции с ним возвращают некорректный результат.
Luxon поддерживает создание интервалов из строк формата ISO 8601
через Interval.fromISO.
const interval = Interval.fromISO("2026-01-01T10:00/2026-01-01T12:00");
Формат всегда включает две части, разделённые символом
/:
start/end
Каждая часть может быть:
Пример с датой:
const interval = Interval.fromISO("2026-01-01/2026-01-05");
В таком случае интервал охватывает период от начала первого дня до конца второго значения в рамках внутренней интерпретации Luxon.
after и beforeLuxon предоставляет способы создания полубесконечных интервалов, где известна только одна граница.
const start = DateTime.local(2026, 1, 1, 10, 0);
const interval = Interval.after(start, { hours: 3 });
В этом случае:
Duration-подобного
форматаconst end = DateTime.local(2026, 1, 1, 12, 0);
const interval = Interval.before(end, { hours: 2 });
Здесь:
end - durationТакие интервалы часто используются при работе с окнами доступности или временными ограничениями.
Если начало и конец совпадают:
const point = DateTime.local(2026, 1, 1, 10, 0);
const interval = Interval.fromDateTimes(point, point);
получается интервал нулевой длины. Он считается валидным, но его продолжительность равна нулю:
interval.length; // 0
Такие интервалы используются для обозначения событий, привязанных к моменту времени без продолжительности.
Интервал может быть помечен как невалидный в нескольких случаях:
end < startDateTimeПроверка осуществляется через свойство:
interval.isValid
После создания интервала его границы доступны напрямую:
const start = interval.start;
const end = interval.end;
Обе границы являются объектами DateTime.
Важно учитывать, что изменение самих DateTime не
мутирует интервал — он остаётся неизменяемым объектом. Любая
трансформация создаёт новый интервал.
Часто интервалы формируются из уже вычисленных дат, например, из результатов API или бизнес-логики.
function createMeetingInterval(meeting) {
return Interval.fromDateTimes(
DateTime.fromISO(meeting.start),
DateTime.fromISO(meeting.end)
);
}
Такой подход позволяет централизованно контролировать корректность временных диапазонов.
Поскольку Interval опирается на DateTime,
временная зона играет критическую роль. При создании интервала:
const start = DateTime.fromISO("2026-01-01T10:00", { zone: "Europe/Almaty" });
const end = DateTime.fromISO("2026-01-01T12:00", { zone: "Europe/Almaty" });
const interval = Interval.fromDateTimes(start, end);
оба значения интерпретируются в рамках одной зоны. Несогласованность зон может приводить к логическим ошибкам при сравнении интервалов.
Luxon не пытается автоматически «исправить» порядок дат. Передача некорректного порядка:
Interval.fromDateTimes(later, earlier);
не приводит к перестановке значений, а формирует невалидный интервал. Поэтому нормализация должна выполняться явно:
const start = DateTime.min(a, b);
const end = DateTime.max(a, b);
const interval = Interval.fromDateTimes(start, end);
Хотя Interval не принимает Duration
напрямую в fromDateTimes, длительность часто участвует в
вычислении границ:
const start = DateTime.local(2026, 1, 1, 10);
const duration = { hours: 4 };
const end = start.plus(duration);
const interval = Interval.fromDateTimes(start, end);
Такой подход позволяет создавать интервалы фиксированной продолжительности от базового момента.
При использовании fromISO допускаются сокращённые
формы:
Interval.fromISO("2026-01-01T10:00/12:00");
В этом случае Luxon интерпретирует вторую часть как время в рамках той же даты, что и начало.
Некоторые строки могут приводить к неожиданным результатам:
Пример:
Interval.fromISO("2026-01-01T10:00/2026-01-01");
В таких случаях конечная точка интерпретируется как начало указанного дня.
Основные способы создания интервалов в Luxon сводятся к нескольким фабрикам:
Interval.fromDateTimes(start, end) — базовый
способInterval.fromISO(string) — строковый парсингInterval.after(start, duration) — интервал вперёдInterval.before(end, duration) — интервал назадInterval.invalid(reason) — создание невалидного
интервалаКаждый метод служит отдельному сценарию моделирования времени и позволяет избегать ручных вычислений границ.
Иногда требуется представление отсутствующего или ошибочного временного диапазона:
const interval = Interval.invalid("Missing time range");
Такой интервал используется как маркер ошибки и не участвует в вычислениях.
Логика формирования интервала в Luxon сводится к единому принципу:
DateTime