Операция объединения в контексте временных интервалов используется
для преобразования набора пересекающихся или смежных интервалов в
минимальный набор непрерывных диапазонов. В библиотеке Luxon это
реализовано через работу с объектами Interval, где метод
union позволяет агрегировать интервалы, устраняя
пересечения и объединяя касающиеся отрезки времени.
Основная цель операции — получить компактное представление временных данных, сохранив покрытие всех исходных интервалов без дублирования и разрывов, если они могут быть объединены.
В Luxon временной интервал представлен объектом
Interval, который описывается двумя границами:
start)end)Интервалы могут:
Метод union применяется для нормализации таких
наборов.
В Luxon объединение интервалов реализуется как статический метод:
Interval.union(intervals)
или как метод экземпляра:
interval.union(...intervals)
Параметры:
intervals — массив или набор объектов
IntervalВозвращаемое значение:
Interval[], содержащий объединённые непрерывные
интервалыАлгоритм объединения выполняет несколько шагов:
Ключевой принцип: любые интервалы, у которых
start <= предыдущий.end, подлежат объединению.
Рассмотрим пересекающиеся интервалы:
import { Interval, DateTime } from "luxon";
const i1 = Interval.fromDateTimes(
DateTime.fromISO("2024-01-01T10:00"),
DateTime.fromISO("2024-01-01T12:00")
);
const i2 = Interval.fromDateTimes(
DateTime.fromISO("2024-01-01T11:00"),
DateTime.fromISO("2024-01-01T13:00")
);
const result = Interval.union([i1, i2]);
Результат:
10:00 → 13:00Логика объединения основана на расширении границ:
Смежные интервалы — это такие, где конец одного совпадает с началом другого.
const i1 = Interval.fromDateTimes(
DateTime.fromISO("2024-01-01T08:00"),
DateTime.fromISO("2024-01-01T10:00")
);
const i2 = Interval.fromDateTimes(
DateTime.fromISO("2024-01-01T10:00"),
DateTime.fromISO("2024-01-01T12:00")
);
const result = Interval.union([i1, i2]);
Результат:
08:00 → 12:00Смежность рассматривается как частный случай объединения без разрыва.
Если интервалы не пересекаются и не соприкасаются, объединение не происходит:
const i1 = Interval.fromDateTimes(
DateTime.fromISO("2024-01-01T08:00"),
DateTime.fromISO("2024-01-01T09:00")
);
const i2 = Interval.fromDateTimes(
DateTime.fromISO("2024-01-01T10:00"),
DateTime.fromISO("2024-01-01T11:00")
);
const result = Interval.union([i1, i2]);
Результат:
Метод корректно работает с произвольным количеством интервалов:
const intervals = [
Interval.fromDateTimes(DateTime.fromISO("2024-01-01T09:00"), DateTime.fromISO("2024-01-01T11:00")),
Interval.fromDateTimes(DateTime.fromISO("2024-01-01T10:30"), DateTime.fromISO("2024-01-01T12:00")),
Interval.fromDateTimes(DateTime.fromISO("2024-01-01T13:00"), DateTime.fromISO("2024-01-01T14:00")),
Interval.fromDateTimes(DateTime.fromISO("2024-01-01T13:30"), DateTime.fromISO("2024-01-01T15:00"))
];
const result = Interval.union(intervals);
Результат:
09:00 → 12:0013:00 → 15:00Происходит каскадное объединение внутри групп пересечений.
Логика сводится к жадному алгоритму:
Ключевые свойства:
Операции часто путаются, но их смысл противоположен:
union — объединяет все покрытия воединоintersection — возвращает пересечение общих частейПример различия:
интервалы: 10:00–12:00 и
11:00–13:00
10:00–13:0011:00–12:00Если входной массив пуст:
Interval.union([])
результат:
Если передан один интервал:
Luxon предполагает, что входные интервалы валидны:
start < endDateTimeНекорректные интервалы могут привести к непредсказуемому результату или игнорированию при объединении.
При обработке занятости пользователей интервалы часто пересекаются:
union позволяет получить итоговую занятость без
дублирования времени.
При подсчёте:
объединение помогает получить компактное представление сегментов.
В системах, где важно хранить временные диапазоны:
При работе с большим набором данных:
startO(n log n)Оптимизация достигается за счёт отсутствия вложенных циклов.
Особый случай возникает, когда интервалы образуют цепочку пересечений:
Результат union объединяет их в один интервал, так как
транзитивное перекрытие учитывается через промежуточный элемент.
Метод часто применяется в комбинации с другими операциями
Interval:
Такой подход позволяет строить многоступенчатую обработку временных данных без потери точности.