Свойства Interval

Интервал в Luxon представляет собой объект, описывающий промежуток времени между двумя моментами. В отличие от DateTime, который фиксирует конкретную точку на временной шкале, Interval работает с диапазоном и предоставляет инструменты для анализа, сравнения и трансформации временных отрезков.

Основная концепция Interval заключается в наличии двух границ: начала и конца. Эти границы всегда выражаются через объекты DateTime. Важно учитывать, что Interval не хранит длительность как отдельное число — он вычисляет её на основе разницы между start и end.

start

Свойство start представляет начало интервала и является экземпляром DateTime.

import { Interval, DateTime } from "luxon";

const start = DateTime.local(2026, 1, 1);
const end = DateTime.local(2026, 1, 10);

const interval = Interval.fromDateTimes(start, end);

console.log(interval.start.toISO());

Ключевые особенности start:

  • всегда DateTime или null (в случае некорректного интервала)
  • неизменяемое значение (immutable)
  • используется как опорная точка для всех вычислений внутри Interval

При работе с start важно учитывать, что любые изменения требуют создания нового DateTime, так как сам Interval не модифицирует внутренние значения.


end

Свойство end задаёт конечную границу интервала и также является DateTime.

console.log(interval.end.toISO());

Особенности end:

  • может быть равен start (нулевой интервал)
  • должен быть строго больше start для корректного непустого интервала
  • используется для вычисления длительности и операций пересечения

Если end отсутствует или меньше start, Interval считается пустым. Это влияет на результаты всех методов анализа.


isValid

Свойство isValid показывает, является ли интервал корректным.

console.log(interval.isValid);

Поведение isValid:

  • true — если start и end заданы корректно и start ≤ end
  • false — если один из DateTime некорректен или end < start

Это свойство критично при работе с динамическими датами, особенно при построении интервалов из пользовательского ввода или внешних источников данных.


invalidReason

Если интервал некорректен, свойство invalidReason содержит текстовую причину.

const bad = Interval.fromDateTimes(end, start);

console.log(bad.invalidReason);

Типичные значения:

  • “invalid start”
  • “invalid end”
  • “end before start”

Это позволяет быстро диагностировать проблемы при создании временных диапазонов.


invalidExplanation

Свойство invalidExplanation предоставляет расширенное описание ошибки.

console.log(bad.invalidExplanation);

В отличие от invalidReason, это более развернутая информация, включающая контекст, полезный для логирования и отладки.


Вычисляемые свойства через Interval

Хотя Interval имеет ограниченный набор собственных полей, его поведение во многом определяется вычисляемыми характеристиками, основанными на start и end.

Длительность интервала

Длительность не хранится явно, но может быть получена через метод toDuration():

const duration = interval.toDuration("days");
console.log(duration.days);

Важно понимать, что:

  • длительность вычисляется динамически
  • результат зависит от временной зоны DateTime
  • при изменении start или end пересчитывается автоматически при создании нового Interval

Внутренние особенности хранения start и end

Interval не копирует DateTime в примитивном виде. Вместо этого он хранит ссылки на неизменяемые объекты DateTime. Это обеспечивает:

  • предсказуемость поведения
  • отсутствие побочных эффектов
  • возможность безопасной передачи объектов между функциями

Однако это также означает, что логика работы Interval строго зависит от корректности исходных DateTime.


Поведение при граничных значениях

Пустой интервал

Если start равен end, интервал считается пустым:

const empty = Interval.fromDateTimes(
  DateTime.local(2026, 1, 1),
  DateTime.local(2026, 1, 1)
);

console.log(empty.isEmpty());

Пустой интервал:

  • считается валидным
  • не содержит времени
  • возвращает нулевую длительность

Некорректные границы

Если end меньше start, Interval становится невалидным:

const invalid = Interval.fromDateTimes(
  DateTime.local(2026, 1, 10),
  DateTime.local(2026, 1, 1)
);

console.log(invalid.isValid);

Такое состояние не допускается для операций пересечения и объединения.


Иммутабельность свойств

Все свойства Interval являются неизменяемыми. Это означает:

  • start и end нельзя изменить напрямую
  • любые операции создают новый Interval
  • состояние объекта остаётся стабильным на протяжении его жизни
const shifted = interval.set({
  start: interval.start.plus({ days: 1 })
});

Даже в этом случае создаётся новый экземпляр, а исходный Interval не изменяется.


Взаимосвязь start и end

Связь между start и end определяет поведение всех операций Interval:

  • пересечение интервалов вычисляется через сравнение start и end
  • объединение зависит от непрерывности диапазонов
  • сравнение интервалов опирается на их границы

Эта модель делает Interval предсказуемым инструментом для работы с временными диапазонами, где границы имеют первостепенное значение.


Использование свойств в логике приложения

При построении систем расписаний, бронирований или временных фильтров свойства start и end используются как базовые координаты:

  • start задаёт момент активации события
  • end определяет его завершение
  • проверка валидности защищает от неконсистентных данных
  • вычисление длительности строится на разнице границ

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