Методы Interval

Объект Interval в Luxon описывает непрерывный промежуток времени между двумя точками — началом и концом. Он строится поверх DateTime и наследует всю точность работы с календарными датами, при этом добавляет операции над временными диапазонами: проверку пересечений, разбиение, объединение и вычисление длительности.

Интервалы в Luxon создаются несколькими способами, каждый из которых отражает разные сценарии работы с временными диапазонами.

Interval.fromDateTimes(start, end) Базовый способ создания интервала из двух объектов DateTime.

Interval.fromDateTimes(DateTime.local(2026, 1, 1), DateTime.local(2026, 1, 10))

Если конечная точка меньше начальной, интервал становится невалидным, что фиксируется через isValid.


Interval.fromISO(string, opts) Позволяет создавать интервал из ISO-строки.

Interval.fromISO("2026-01-01/2026-01-10")

Поддерживаются форматы с разделителем /, где левая часть — начало, правая — конец.


Interval.fromObject({ start, end }) Универсальный способ создания через объектную форму.

Interval.fromObject({
  start: DateTime.local(2026, 1, 1),
  end: DateTime.local(2026, 1, 10)
})

Interval.after(dateTime, duration) Создаёт интервал, начинающийся после заданной точки.

Interval.after(DateTime.local(2026, 1, 1), Duration.fromObject({ days: 5 }))

Конец интервала вычисляется автоматически.


Interval.before(dateTime, duration) Формирует интервал, заканчивающийся в указанной точке времени.

Interval.before(DateTime.local(2026, 1, 10), Duration.fromObject({ days: 5 }))

Базовые свойства

start / end Доступ к границам интервала.

interval.start
interval.end

Оба значения являются объектами DateTime.


isValid Проверка корректности интервала.

Интервал считается невалидным, если:

  • отсутствует start или end
  • end меньше start
interval.isValid

length Длина интервала в миллисекундах.

interval.length

Возвращает число, отражающее разницу между end и start.


Проверка принадлежности времени

contains(dateTime) Определяет, входит ли момент времени в интервал.

interval.contains(DateTime.local(2026, 1, 5))

Границы обычно включаются: start ≤ t ≤ end.


Сравнение и отношения интервалов

Interval поддерживает операции над двумя временными диапазонами, что позволяет строить сложную логику планирования.


engulfs(otherInterval) Проверяет, полностью ли один интервал покрывает другой.

intervalA.engulfs(intervalB)

Истина возвращается, если:

  • startA ≤ startB
  • endA ≥ endB

overlaps(otherInterval) Проверяет наличие пересечения.

intervalA.overlaps(intervalB)

Пересечение существует, если хотя бы часть диапазонов совпадает.


intersection(otherInterval) Возвращает новый интервал пересечения.

const inter = intervalA.intersection(intervalB)

Если пересечения нет — результат невалидный интервал.


union(otherInterval) Объединяет два пересекающихся или смежных интервала.

const united = intervalA.union(intervalB)

Если интервалы не пересекаются и не касаются, операция может вернуть невалидный результат.


equals(otherInterval) Проверяет полное совпадение границ.

intervalA.equals(intervalB)

Совпадение требует идентичности start и end.


Разбиение интервалов

splitAt(…dateTimes) Разбивает интервал по указанным точкам.

interval.splitAt(
  DateTime.local(2026, 1, 3),
  DateTime.local(2026, 1, 6)
)

Результатом является массив подынтервалов, отсортированных по времени.

Особенности:

  • точки вне интервала игнорируются
  • сортировка выполняется автоматически

splitBy(duration) Разбиение на равные части по длительности.

interval.splitBy(Duration.fromObject({ days: 2 }))

Используется для сегментации диапазонов на равные отрезки.

Если интервал не делится ровно, последний сегмент будет короче.


Трансформация интервалов

mapEndpoints(mapFn) Позволяет преобразовать границы интервала.

interval.mapEndpoints(dt => dt.plus({ days: 1 }))

Функция применяется отдельно к start и end, возвращая новый интервал.

Используется для:

  • сдвига диапазонов
  • нормализации временных окон
  • адаптации под разные зоны времени

Представление и сериализация

toISO() Возвращает строковое представление интервала в ISO-формате.

interval.toISO()

Результат:

2026-01-01T00:00:00.000Z/2026-01-10T00:00:00.000Z

toString() Человеко-читаемое строковое представление.

interval.toString()

Используется для отладки и логирования.


toDuration(unit?) Преобразует интервал в Duration.

interval.toDuration()

Можно указать единицы измерения:

interval.toDuration("days")

Результат отражает разницу между start и end в форме Duration.


Поведение при граничных случаях

Интервал в Luxon строго опирается на корректность границ:

  • если start или end отсутствуют — интервал невалиден
  • если используется неправильный порядок дат — isValid возвращает false
  • операции intersection и union могут возвращать невалидные интервалы при отсутствии пересечения

Проверка isValid становится обязательной при динамическом формировании диапазонов.


Работа с включённостью границ

Интервалы Luxon включают обе границы по умолчанию. Это влияет на:

  • contains
  • overlaps
  • splitAt

Граничные значения считаются частью интервала, что важно при работе с календарными периодами (дни, недели, месяцы).


Сценарии комбинирования методов

Interval часто используется как основа цепочек операций:

  • формирование интервала → проверка пересечения → извлечение общей части
  • разбиение → трансформация сегментов → повторное объединение
  • генерация окон времени → проверка попадания событий → фильтрация

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