Метод overlaps

Метод overlaps относится к классу Interval библиотеки Luxon и предназначен для проверки пересечения двух временных интервалов. Он возвращает логическое значение, показывающее, имеют ли два интервала хотя бы один общий момент времени.

Интервалы в Luxon представляются как полуоткрытые отрезки времени:

[start, end) — начало включено, конец исключён.

Это критически важно для корректного понимания логики пересечения.


Сигнатура метода

interval.overlaps(otherInterval)
  • interval — текущий объект Interval
  • otherInterval — другой экземпляр Interval
  • возвращает boolean

Базовая логика пересечения

Два интервала считаются пересекающимися, если существует хотя бы один момент времени, который принадлежит обоим интервалам.

С учётом полуоткрытой модели Luxon условие пересечения можно выразить так:

  • интервал A: [startA, endA)
  • интервал B: [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), так как выполняет только сравнение четырёх значений времени:

  • start текущего интервала
  • end текущего интервала
  • start другого интервала
  • end другого интервала

Это делает его оптимальным для:

  • фильтрации расписаний
  • поиска конфликтов событий
  • проверки занятости ресурсов
  • построения календарных систем

Пример фильтрации:

const freeSlots = slots.filter(slot => !slot.overlaps(busyInterval));

Особенности работы с часовыми поясами

Interval в Luxon оперирует моментами времени (Instant), а не локальными представлениями дат. Поэтому:

  • часовой пояс не влияет на overlaps
  • сравнение происходит в абсолютной временной шкале UTC
const 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); // зависит только от абсолютного времени

Частые ошибки при использовании

Ошибка интерпретации границ

Ожидание, что касающиеся интервалы пересекаются, приводит к логическим ошибкам в расписаниях.

Сравнение DateTime вместо Interval

// некорректный подход
date1 < date2

Правильный подход — через интервалы:

Interval.fromDateTimes(start1, end1).overlaps(
  Interval.fromDateTimes(start2, end2)
);

Использование в системах планирования

Метод особенно полезен при построении систем:

  • бронирования
  • календарей событий
  • распределения ресурсов
  • анализа временных конфликтов

Типовой алгоритм проверки конфликта:

function hasConflict(newInterval, existingIntervals) {
  return existingIntervals.some(i => i.overlaps(newInterval));
}

Этот подход масштабируется и остаётся читаемым даже при большом количестве данных.