Метод overlaps относится к классу Interval
библиотеки Luxon и предназначен для проверки пересечения двух временных
интервалов. Он возвращает логическое значение, показывающее, имеют ли
два интервала хотя бы один общий момент времени.
Интервалы в Luxon представляются как полуоткрытые отрезки времени:
[start, end) — начало включено, конец исключён.
Это критически важно для корректного понимания логики пересечения.
interval.overlaps(otherInterval)
interval — текущий объект IntervalotherInterval — другой экземпляр
IntervalbooleanДва интервала считаются пересекающимися, если существует хотя бы один момент времени, который принадлежит обоим интервалам.
С учётом полуоткрытой модели Luxon условие пересечения можно выразить так:
[startA, endA)[startB, endB)Пересечение существует, если:
startA < endB иstartB < endAЕсли хотя бы одно из условий нарушается, пересечения нет.
import { DateTime, Interval } from "luxon";
const a = Interval.fromDateTimes(
DateTime.fromISO("2026-01-01T10:00"),
DateTime.fromISO("2026-01-01T12:00")
);
const b = Interval.fromDateTimes(
DateTime.fromISO("2026-01-01T11:00"),
DateTime.fromISO("2026-01-01T13:00")
);
a.overlaps(b); // true
b.overlaps(a); // true
Интервалы пересекаются в диапазоне 11:00–12:00.
const a = Interval.fromDateTimes(
DateTime.fromISO("2026-01-01T10:00"),
DateTime.fromISO("2026-01-01T11:00")
);
const b = Interval.fromDateTimes(
DateTime.fromISO("2026-01-01T11:00"),
DateTime.fromISO("2026-01-01T12:00")
);
a.overlaps(b); // false
Хотя границы совпадают, пересечения нет, поскольку конец первого интервала не включается.
Особенность Luxon заключается в том, что интервалы, которые “касаются”, но не пересекаются, считаются не пересекающимися.
const a = Interval.fromDateTimes(
DateTime.fromISO("2026-01-01T10:00"),
DateTime.fromISO("2026-01-01T11:00")
);
const b = Interval.fromDateTimes(
DateTime.fromISO("2026-01-01T11:00"),
DateTime.fromISO("2026-01-01T11:30")
);
a.overlaps(b); // false
Это поведение часто важно при планировании расписаний, где соприкосновение интервалов не считается конфликтом.
Если один интервал полностью находится внутри другого, пересечение
всегда возвращает true.
const outer = Interval.fromDateTimes(
DateTime.fromISO("2026-01-01T09:00"),
DateTime.fromISO("2026-01-01T18:00")
);
const inner = Interval.fromDateTimes(
DateTime.fromISO("2026-01-01T12:00"),
DateTime.fromISO("2026-01-01T13:00")
);
outer.overlaps(inner); // true
inner.overlaps(outer); // true
interval.overlaps(interval); // true
Любой интервал пересекается сам с собой, так как полностью совпадает.
Если хотя бы один из интервалов некорректен (invalid),
результат может быть неопределённым с точки зрения бизнес-логики, но
Luxon обычно возвращает false.
const invalid = Interval.invalid("error");
validInterval.overlaps(invalid); // false
abutsПроверяет, соприкасаются ли интервалы без пересечения.
a.abuts(b); // true при a.end === b.start
containsПроверяет, полностью ли один интервал включает другой или точку.
outer.contains(inner); // true
intersectionВозвращает новый интервал пересечения или null.
const i = a.intersection(b); // Interval или null
overlaps — это более лёгкая проверка, без создания
нового объекта.
Метод overlaps работает за O(1), так
как выполняет только сравнение четырёх значений времени:
Это делает его оптимальным для:
Пример фильтрации:
const freeSlots = slots.filter(slot => !slot.overlaps(busyInterval));
Interval в Luxon оперирует моментами времени (Instant),
а не локальными представлениями дат. Поэтому:
overlapsconst a = Interval.fromDateTimes(
DateTime.fromISO("2026-01-01T10:00+03:00"),
DateTime.fromISO("2026-01-01T11:00+03:00")
);
const b = Interval.fromDateTimes(
DateTime.fromISO("2026-01-01T09:00Z"),
DateTime.fromISO("2026-01-01T10:30Z")
);
a.overlaps(b); // зависит только от абсолютного времени
Ожидание, что касающиеся интервалы пересекаются, приводит к логическим ошибкам в расписаниях.
// некорректный подход
date1 < date2
Правильный подход — через интервалы:
Interval.fromDateTimes(start1, end1).overlaps(
Interval.fromDateTimes(start2, end2)
);
Метод особенно полезен при построении систем:
Типовой алгоритм проверки конфликта:
function hasConflict(newInterval, existingIntervals) {
return existingIntervals.some(i => i.overlaps(newInterval));
}
Этот подход масштабируется и остаётся читаемым даже при большом количестве данных.