В библиотеке Luxon пересечение интервалов реализуется через метод
intersection, доступный у экземпляров класса
Interval. Интервалы в Luxon представляют собой отрезки
времени с началом и концом, где логика работы построена на строгом
сравнении границ: начальной (start) и конечной
(end).
Интервалы интерпретируются как полуоткрытые отрезки вида
[start, end), где начальная точка включена, а конечная —
нет. Это влияет на результат пересечения, особенно при работе с
соседними интервалами, которые формально не пересекаются.
Метод вызывается у экземпляра интервала:
interval1.intersection(interval2)
interval2: Interval — второй интервал, с которым
выполняется операция пересеченияInterval — новый интервал, представляющий
пересечениеnull — если пересечения нетПересечение двух интервалов — это новый интервал, который включает только ту часть времени, которая присутствует одновременно в обоих интервалах.
Для двух интервалов:
A = [A.start, A.end)B = [B.start, B.end)результат пересечения вычисляется как:
max(A.start, B.start)min(A.end, B.end)Если вычисленный конец меньше или равен началу, пересечения нет.
Если один интервал полностью содержится в другом:
import { DateTime, Interval } from "luxon";
const a = Interval.fromDateTimes(
DateTime.fromISO("2026-05-01T10:00"),
DateTime.fromISO("2026-05-01T18:00")
);
const b = Interval.fromDateTimes(
DateTime.fromISO("2026-05-01T12:00"),
DateTime.fromISO("2026-05-01T14:00")
);
const result = a.intersection(b);
Результат:
[2026-05-01 12:00, 2026-05-01 14:00)
const a = Interval.fromDateTimes(
DateTime.fromISO("2026-05-01T10:00"),
DateTime.fromISO("2026-05-01T15:00")
);
const b = Interval.fromDateTimes(
DateTime.fromISO("2026-05-01T12:00"),
DateTime.fromISO("2026-05-01T18:00")
);
const result = a.intersection(b);
Результат:
[2026-05-01 12:00, 2026-05-01 15:00)
const a = Interval.fromDateTimes(
DateTime.fromISO("2026-05-01T10:00"),
DateTime.fromISO("2026-05-01T12:00")
);
const b = Interval.fromDateTimes(
DateTime.fromISO("2026-05-01T12:00"),
DateTime.fromISO("2026-05-01T14:00")
);
const result = a.intersection(b);
Результат:
null
Причина: конец первого интервала совпадает с началом второго, а
полуоткрытая модель [start, end) исключает точку
end.
const a = Interval.fromDateTimes(
DateTime.fromISO("2026-05-01T08:00"),
DateTime.fromISO("2026-05-01T09:00")
);
const b = Interval.fromDateTimes(
DateTime.fromISO("2026-05-01T10:00"),
DateTime.fromISO("2026-05-01T11:00")
);
const result = a.intersection(b);
Результат:
null
Пусть интервалы заданы как:
A = [a1, a2)
B = [b1, b2)
Тогда пересечение:
A ∩ B = [max(a1, b1), min(a2, b2))
Существование пересечения определяется условием:
max(a1, b1) < min(a2, b2)
A B = [(a_1, b_1), (a_2, b_2))
Luxon хранит моменты времени как DateTime, которые уже
включают информацию о временной зоне или фиксируются в UTC.
При пересечении интервалов важно учитывать:
Пример:
const a = Interval.fromDateTimes(
DateTime.fromISO("2026-05-01T10:00+03:00"),
DateTime.fromISO("2026-05-01T12:00+03:00")
);
const b = Interval.fromDateTimes(
DateTime.fromISO("2026-05-01T09:00Z"),
DateTime.fromISO("2026-05-01T11:00Z")
);
Luxon автоматически приводит значения к единой временной шкале перед сравнением.
Особое внимание требуется при совпадении границ:
A.end === B.start, пересечения нетnullЭто важно для планирования задач, расписаний и бронирований, где такие случаи часто встречаются.
Метод intersection часто используется вместе с:
overlaps() — проверка наличия пересечения без
вычисления интервалаunion() (через объединение логики вручную) — построение
общего диапазонаisBefore, isAfter — анализ расположения
интерваловПример проверки перед пересечением:
if (a.overlaps(b)) {
const result = a.intersection(b);
}
Распространённое заблуждение — считать интервалы закрытыми
[start, end], что приводит к неожиданным null
при касании границ.
const result = a.intersection(b);
console.log(result.start); // ошибка, если result == null
Корректная обработка:
const result = a.intersection(b);
if (result) {
console.log(result.start.toISO());
}
a.intersection(b) === b.intersection(a)
Метод действительно симметричен по результату, но не по внутреннему контексту использования, особенно если далее применяются цепочки операций над интервалами.
Метод используется в задачах:
Пример нахождения общего времени доступности:
const common = meetingsA.intersection(meetingsB);
if (common) {
// есть общий слот
}
Luxon предполагает, что:
start < endЕсли интервал создан с нарушением этого условия, поведение методов,
включая intersection, становится неопределённым или
приводит к пустым результатам.
Метод может применяться последовательно:
const result = a
.intersection(b)
?.intersection(c);
Такая цепочка позволяет вычислять общую область пересечения множества интервалов, сводя задачу к последовательному сужению диапазона времени.