Метод splitAt в библиотеке Luxon применяется к объектам
Interval и предназначен для разбиения временного интервала
на несколько меньших интервалов по заданным точкам разреза. Он
используется для сегментации временных диапазонов, когда требуется
получить последовательность непрерывных частей, ограниченных конкретными
моментами времени.
interval.splitAt(...DateTime[] | DateTime[]): Interval[]
Метод принимает произвольное количество объектов
DateTime или один массив DateTime. Каждый
переданный момент времени рассматривается как точка разреза исходного
интервала.
Результатом работы является массив объектов
Interval.
splitAt делит исходный интервал на части, используя
переданные точки как границы.
Основные принципы работы:
Если точки разреза отсутствуют или не попадают в диапазон интервала, возвращается массив, содержащий исходный интервал без изменений.
import { DateTime, Interval } from "luxon";
const start = DateTime.fromISO("2026-01-01T00:00:00");
const end = DateTime.fromISO("2026-01-01T12:00:00");
const interval = Interval.fromDateTimes(start, end);
const split = interval.splitAt(
DateTime.fromISO("2026-01-01T04:00:00"),
DateTime.fromISO("2026-01-01T08:00:00")
);
split.forEach(i => {
console.log(i.toISO());
});
Результат будет содержать три интервала:
Переданные значения не требуют предварительной сортировки.
splitAt самостоятельно упорядочивает их по возрастанию
времени.
interval.splitAt(
DateTime.fromISO("2026-01-01T10:00:00"),
DateTime.fromISO("2026-01-01T02:00:00"),
DateTime.fromISO("2026-01-01T06:00:00")
);
Фактический порядок разбиения будет: 02:00 → 06:00 → 10:00.
Если точка разреза выходит за пределы интервала, она не влияет на результат.
const interval = Interval.fromDateTimes(
DateTime.fromISO("2026-01-01T05:00:00"),
DateTime.fromISO("2026-01-01T10:00:00")
);
const result = interval.splitAt(
DateTime.fromISO("2026-01-01T01:00:00"),
DateTime.fromISO("2026-01-01T07:00:00"),
DateTime.fromISO("2026-01-01T12:00:00")
);
В этом случае учитывается только 07:00, остальные точки игнорируются.
Если метод вызывается без аргументов:
const result = interval.splitAt();
возвращается массив из одного элемента — исходного интервала:
[ interval ]
Точки разреза, совпадающие с началом или концом интервала, могут создавать сегменты нулевой длины или быть проигнорированы в зависимости от положения:
Если несколько точек разреза совпадают по времени, они не приводят к созданию дублирующих сегментов. Интервал разрезается один раз в этой точке.
splitAt не ограничен равномерными шагами. Он может
создавать сегменты произвольной длины, что делает его удобным для
моделирования событийной структуры времени:
const workDay = Interval.fromDateTimes(
DateTime.fromISO("2026-01-01T09:00:00"),
DateTime.fromISO("2026-01-01T18:00:00")
);
const breaks = workDay.splitAt(
DateTime.fromISO("2026-01-01T12:00:00"),
DateTime.fromISO("2026-01-01T15:00:00")
);
Результат:
Метод splitAt не следует фиксированному шагу и работает
исключительно с явными точками разреза. В отличие от него,
splitBy (если используется в связке с интервалами в
сторонних реализациях или утилитах) ориентирован на равномерное деление
по длительности.
Ключевые различия:
splitAt — разбиение по конкретным моментам
времени;splitBy — разбиение по регулярному интервалу (например,
каждые 30 минут).Результирующий массив интервалов обладает следующими свойствами:
Interval;splitAt часто применяется как промежуточный этап перед
дальнейшей обработкой интервалов:
const segments = interval
.splitAt(t1, t2, t3)
.map(i => i.toDuration().as("hours"));
Такой подход позволяет:
Так как Interval опирается на DateTime,
разрезание учитывает временные зоны объектов. При смешении
DateTime с разными зонами происходит нормализация к единому
внутреннему представлению, после чего выполняется разбиение.
Это означает:
При некорректных или невалидных значениях DateTime
(например, Invalid DateTime) такие точки игнорируются. Это
предотвращает разрушение результата, но может приводить к неожиданно
неделённому интервалу.
Логика метода сводится к следующей последовательности:
Interval.