В библиотеке Luxon метод
Interval.fromDateTimes(start, end) используется для
создания временного интервала на основе двух объектов
DateTime. Интервал формируется строго между начальной и
конечной точками времени, при этом выполняется нормализация порядка дат
и проверка корректности диапазона.
Interval.fromDateTimes предназначен для построения
интервала времени, когда:
start и
end);Метод возвращает экземпляр Interval, который является
неизменяемым (immutable).
Interval.fromDateTimes(start, end)
DateTime, обозначающий
начало интервалаDateTime, обозначающий
конец интервалаОба параметра должны быть валидными экземплярами
DateTime. При передаче некорректных значений результат
будет невалидным интервалом.
Если start позже end, библиотека
автоматически меняет их местами:
import { DateTime, Interval } from "luxon";
const a = DateTime.local(2025, 5, 10);
const b = DateTime.local(2025, 5, 1);
const interval = Interval.fromDateTimes(a, b);
console.log(interval.start.toISO()); // 2025-05-01
console.log(interval.end.toISO()); // 2025-05-10
Таким образом, порядок аргументов не влияет на корректность результата.
DateTime в Luxon всегда содержит информацию о временной
зоне. При создании интервала:
DateTime без преобразования
в UTC;const start = DateTime.fromISO("2025-05-01T10:00", { zone: "Europe/Berlin" });
const end = DateTime.fromISO("2025-05-01T10:00", { zone: "UTC" });
const interval = Interval.fromDateTimes(start, end);
Даже при разных зонах интервал строится корректно, так как Luxon сравнивает абсолютные моменты времени.
Интервал может быть невалидным, если:
DateTime;DateTime невалиден
(Invalid DateTime).Проверка выполняется через свойство:
interval.isValid
После создания интервала доступны ключевые свойства:
Границы интервала:
interval.start
interval.end
Оба значения — DateTime.
Длительность интервала в миллисекундах:
interval.toDuration().as("milliseconds")
Проверка на нулевую длительность:
interval.isEmpty()
import { DateTime, Interval } from "luxon";
const start = DateTime.local(2026, 1, 1, 9, 0);
const end = DateTime.local(2026, 1, 1, 18, 0);
const workDay = Interval.fromDateTimes(start, end);
const intervalA = Interval.fromDateTimes(
DateTime.local(2026, 1, 1, 9),
DateTime.local(2026, 1, 1, 12)
);
const intervalB = Interval.fromDateTimes(
DateTime.local(2026, 1, 1, 11),
DateTime.local(2026, 1, 1, 14)
);
const overlap = intervalA.intersection(intervalB);
Результат — интервал с 11:00 до 12:00.
const interval = Interval.fromDateTimes(
DateTime.local(2026, 1, 1, 9),
DateTime.local(2026, 1, 1, 17)
);
const check = DateTime.local(2026, 1, 1, 10);
interval.contains(check); // true
Любая операция над интервалом возвращает новый объект:
const shifted = interval.mapEndpoints(d => d.plus({ hours: 1 }));
Исходный интервал не изменяется.
Интервалы в Luxon рассматриваются как полуоткрытые:
[start, end)
Это означает:
Если start и end совпадают:
const interval = Interval.fromDateTimes(dt, dt);
получается пустой интервал, который считается валидным, но имеет нулевую длительность.
Используется для строкового представления:
Interval.fromISO("2026-01-01T09:00/2026-01-01T17:00");
Подходит для сериализации, но менее гибок при работе с объектами
DateTime.
Предпочтителен при программном построении интервалов:
DateTime;DateTime;