В модели времени Luxon ключевым строительным блоком для работы с
диапазонами дат выступает интервал (Interval). Он описывает
непрерывный участок времени между двумя моментами: началом
(start) и концом (end). При анализе
последовательностей интервалов возникает задача определения их
соприкосновения без перекрытия — состояния, при котором один интервал
заканчивается ровно в момент начала другого или наоборот.
Смежность интервалов не является пересечением: между ними отсутствует общая длительность, но существует точка касания границ. Для формализации этого поведения используются проверки, основанные на равенстве границ и сравнении временных точек.
Метод abutsStart описывает ситуацию, когда текущий
интервал непосредственно примыкает к началу другого интервала. Иначе
говоря, конец одного интервала совпадает с началом второго без
временного разрыва.
Интервал A считается примыкающим к началу интервала
B, если выполняется условие:
A.end === B.startПри этом отсутствует пересечение:
A.end не больше B.startA и B не имеют общей временной
областиМетод возвращает булево значение:
true — если конец текущего интервала совпадает с
началом проверяемого интервалаfalse — во всех остальных случаяхВажно учитывать, что сравнение выполняется с точностью до внутреннего представления времени Luxon (обычно миллисекунды с учётом временной зоны).
Проверка смежности начала реализуется через сравнение граничных значений:
Дополнительно исключается ситуация пересечения:
A.end > B.start, интервал уже перекрывается и
не считается смежнымСлучай точного касания:
Результат:
A.abutsStart(B) → trueСлучай разрыва:
Результат:
A.abutsStart(B) → falseСлучай перекрытия:
Результат:
A.abutsStart(B) → falseМетод abutsEnd отражает симметричную ситуацию, при
которой начало одного интервала совпадает с концом другого.
Интервал A считается примыкающим к концу интервала
B, если:
A.start === B.endМетод возвращает:
true — если начало текущего интервала совпадает с
концом проверяемогоfalse — в остальных случаяхПроверка выполняется по следующей схеме:
ABПерекрывающиеся интервалы автоматически исключаются, поскольку при наличии пересечения границы не совпадают строго в одной точке.
Смежность конца:
Результат:
A.abutsEnd(B) → trueРазрыв:
Результат:
A.abutsEnd(B) → falseПерекрытие:
Результат:
A.abutsEnd(B) → falseНесмотря на симметричность, методы отражают разные направления логики:
abutsStart — проверяет касание конца текущего интервала
к началу другогоabutsEnd — проверяет касание начала текущего интервала
к концу другогоЭти операции не взаимозаменяемы в контексте направленных последовательностей событий, где порядок имеет смысл (например, расписания или лог событий).
Luxon опирается на DateTime, который включает информацию
о временной зоне. При сравнении границ интервалов учитываются:
Это означает, что два интервала, визуально совпадающие по локальному времени, могут не быть смежными в абсолютных миллисекундах, если находятся в разных временных зонах.
При работе с интервалами критически важно учитывать:
DateTimeСмежность определяется исключительно строгим равенством границ, без допуска погрешности.
Механизмы abutsStart и abutsEnd
используются при построении цепочек интервалов, где важно:
Типичный сценарий — слияние интервалов, где смежные сегменты объединяются в единый диапазон при условии отсутствия зазора между ними.