Метод abutsStart и abutsEnd

В модели времени Luxon ключевым строительным блоком для работы с диапазонами дат выступает интервал (Interval). Он описывает непрерывный участок времени между двумя моментами: началом (start) и концом (end). При анализе последовательностей интервалов возникает задача определения их соприкосновения без перекрытия — состояния, при котором один интервал заканчивается ровно в момент начала другого или наоборот.

Смежность интервалов не является пересечением: между ними отсутствует общая длительность, но существует точка касания границ. Для формализации этого поведения используются проверки, основанные на равенстве границ и сравнении временных точек.


Метод abutsStart: логика касания начала интервала

Метод abutsStart описывает ситуацию, когда текущий интервал непосредственно примыкает к началу другого интервала. Иначе говоря, конец одного интервала совпадает с началом второго без временного разрыва.

Формальное определение

Интервал A считается примыкающим к началу интервала B, если выполняется условие:

  • A.end === B.start

При этом отсутствует пересечение:

  • A.end не больше B.start
  • A и B не имеют общей временной области

Возвращаемое значение и поведение

Метод возвращает булево значение:

  • true — если конец текущего интервала совпадает с началом проверяемого интервала
  • false — во всех остальных случаях

Важно учитывать, что сравнение выполняется с точностью до внутреннего представления времени Luxon (обычно миллисекунды с учётом временной зоны).


Логическая модель проверки

Проверка смежности начала реализуется через сравнение граничных значений:

  1. Извлекается конец первого интервала
  2. Извлекается начало второго интервала
  3. Выполняется строгая проверка равенства временных точек

Дополнительно исключается ситуация пересечения:

  • если A.end > B.start, интервал уже перекрывается и не считается смежным

Примеры поведения

Случай точного касания:

  • Интервал A: 10:00–11:00
  • Интервал B: 11:00–12:00

Результат:

  • A.abutsStart(B) → true

Случай разрыва:

  • Интервал A: 10:00–10:59
  • Интервал B: 11:00–12:00

Результат:

  • A.abutsStart(B) → false

Случай перекрытия:

  • Интервал A: 10:00–11:30
  • Интервал B: 11:00–12:00

Результат:

  • A.abutsStart(B) → false

Метод abutsEnd: логика касания конца интервала

Метод abutsEnd отражает симметричную ситуацию, при которой начало одного интервала совпадает с концом другого.

Формальное определение

Интервал A считается примыкающим к концу интервала B, если:

  • A.start === B.end

Возвращаемое значение

Метод возвращает:

  • true — если начало текущего интервала совпадает с концом проверяемого
  • false — в остальных случаях

Алгоритмическая проверка

Проверка выполняется по следующей схеме:

  1. Извлекается начало интервала A
  2. Извлекается конец интервала B
  3. Сравниваются временные точки на полное равенство

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


Примеры поведения

Смежность конца:

  • Интервал A: 11:00–12:00
  • Интервал B: 10:00–11:00

Результат:

  • A.abutsEnd(B) → true

Разрыв:

  • Интервал A: 11:01–12:00
  • Интервал B: 10:00–11:00

Результат:

  • A.abutsEnd(B) → false

Перекрытие:

  • Интервал A: 10:30–12:00
  • Интервал B: 10:00–11:00

Результат:

  • A.abutsEnd(B) → false

Различия между abutsStart и abutsEnd

Несмотря на симметричность, методы отражают разные направления логики:

  • abutsStart — проверяет касание конца текущего интервала к началу другого
  • abutsEnd — проверяет касание начала текущего интервала к концу другого

Эти операции не взаимозаменяемы в контексте направленных последовательностей событий, где порядок имеет смысл (например, расписания или лог событий).


Особенности работы с временными зонами

Luxon опирается на DateTime, который включает информацию о временной зоне. При сравнении границ интервалов учитываются:

  • смещение UTC
  • локальные переходы времени
  • возможные DST-переходы (летнее/зимнее время)

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


Пограничные случаи и точность сравнения

При работе с интервалами критически важно учитывать:

  • минимальную единицу измерения (миллисекунды)
  • возможные округления при создании DateTime
  • преобразования между форматами времени

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


Применение в обработке последовательностей времени

Механизмы abutsStart и abutsEnd используются при построении цепочек интервалов, где важно:

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

Типичный сценарий — слияние интервалов, где смежные сегменты объединяются в единый диапазон при условии отсутствия зазора между ними.