Метод fromDateTimes

В библиотеке Luxon метод Interval.fromDateTimes(start, end) используется для создания временного интервала на основе двух объектов DateTime. Интервал формируется строго между начальной и конечной точками времени, при этом выполняется нормализация порядка дат и проверка корректности диапазона.


Назначение метода

Interval.fromDateTimes предназначен для построения интервала времени, когда:

  • известны две конкретные точки во времени (start и end);
  • требуется получить объект интервала для дальнейших операций (пересечения, проверки включения, длительности);
  • важно учитывать часовые пояса и корректную нормализацию дат.

Метод возвращает экземпляр Interval, который является неизменяемым (immutable).


Сигнатура

Interval.fromDateTimes(start, end)

Параметры

  • start — объект DateTime, обозначающий начало интервала
  • end — объект 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;
  • сравнение выполняется в абсолютном времени (timestamp-based).
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

Основные свойства результата

После создания интервала доступны ключевые свойства:

start / end

Границы интервала:

interval.start
interval.end

Оба значения — DateTime.


length

Длительность интервала в миллисекундах:

interval.toDuration().as("milliseconds")

isEmpty

Проверка на нулевую длительность:

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

Особенности работы

1. Иммутабельность

Любая операция над интервалом возвращает новый объект:

const shifted = interval.mapEndpoints(d => d.plus({ hours: 1 }));

Исходный интервал не изменяется.


2. Полуоткрытая модель времени

Интервалы в Luxon рассматриваются как полуоткрытые:

[start, end)

Это означает:

  • начало включено;
  • конец не включён.

3. Поведение при равных датах

Если start и end совпадают:

const interval = Interval.fromDateTimes(dt, dt);

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


Сравнение с альтернативными способами создания

Interval.fromISO

Используется для строкового представления:

Interval.fromISO("2026-01-01T09:00/2026-01-01T17:00");

Подходит для сериализации, но менее гибок при работе с объектами DateTime.


Interval.fromDateTimes

Предпочтителен при программном построении интервалов:

  • высокая точность контроля;
  • работа напрямую с DateTime;
  • отсутствие необходимости парсинга строк.

Типичные сценарии применения

  • расчёт рабочих смен;
  • проверка пересечений расписаний;
  • вычисление свободных временных окон;
  • моделирование событий календаря;
  • агрегация временных диапазонов.

Ограничения и нюансы

  • метод не выполняет автоматическую конвертацию в конкретную временную зону;
  • результат зависит от корректности входных DateTime;
  • не предназначен для работы с датами без времени (в таких случаях требуется явное указание начала и конца дня).