Метод contains

Метод contains() используется в объекте Interval библиотеки Luxon и предназначен для проверки, находится ли заданный момент времени внутри интервала. Это один из базовых инструментов для работы с временными диапазонами, поскольку позволяет выполнять логические проверки принадлежности даты к промежутку без ручных сравнений.

Сигнатура метода

interval.contains(dateTime)

Параметр:

  • dateTime — экземпляр DateTime из Luxon (или значение, приводимое к DateTime)

Возвращаемое значение:

  • boolean

    • true — если момент времени находится внутри интервала
    • false — если момент времени вне интервала

Логика работы contains

Интервал в Luxon представляет собой диапазон между двумя точками времени:

  • start — начало интервала
  • end — конец интервала

Метод contains() проверяет принадлежность по правилу:

  • начало интервала считается включённым
  • конец интервала считается исключённым

Иными словами:

start <= dateTime < end

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


Базовый пример использования

import { DateTime, Interval } from "luxon";

const start = DateTime.fromISO("2026-01-01T00:00:00");
const end = DateTime.fromISO("2026-01-10T00:00:00");

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

const checkDate = DateTime.fromISO("2026-01-05T12:00:00");

interval.contains(checkDate); // true

Здесь дата попадает внутрь интервала, поскольку находится между началом и концом диапазона.


Проверка граничных значений

Начало интервала включается

const start = DateTime.fromISO("2026-01-01T00:00:00");
const end = DateTime.fromISO("2026-01-10T00:00:00");

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

interval.contains(start); // true

Конец интервала не включается

interval.contains(end); // false

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


Поведение при работе с временными зонами

Luxon строго учитывает временные зоны, поскольку DateTime всегда содержит информацию о зоне.

const start = DateTime.fromISO("2026-01-01T00:00:00", { zone: "UTC" });
const end = DateTime.fromISO("2026-01-02T00:00:00", { zone: "UTC" });

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

const local = DateTime.fromISO("2026-01-01T23:00:00", { zone: "UTC" });

interval.contains(local); // true

Если сравниваются значения в разных зонах, Luxon автоматически нормализует их к абсолютному времени.


Использование с текущим временем

Частый сценарий — проверка, попадает ли текущее время в заданный интервал.

const interval = Interval.fromDateTimes(
  DateTime.now().minus({ hours: 1 }),
  DateTime.now().plus({ hours: 1 })
);

interval.contains(DateTime.now()); // true

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

Если интервал некорректен (например, отсутствует start или end), результат будет предсказуемо ложным:

const interval = Interval.fromDateTimes(
  DateTime.fromISO("2026-01-10"),
  DateTime.fromISO("2026-01-01")
);

interval.isValid; // false
interval.contains(DateTime.now()); // false

Luxon не пытается «исправлять» перевёрнутые интервалы, поэтому проверка валидности важна перед использованием.


Работа с моментами вне интервала

Метод возвращает false для всех значений, которые:

  • меньше start
  • больше или равны end
const start = DateTime.fromISO("2026-01-01T00:00:00");
const end = DateTime.fromISO("2026-01-10T00:00:00");

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

const before = DateTime.fromISO("2025-12-31T23:59:59");
const after = DateTime.fromISO("2026-01-10T00:00:00");

interval.contains(before); // false
interval.contains(after);  // false

Влияние точности времени

Luxon сравнивает даты с точностью до миллисекунд. Это означает, что даже минимальное смещение влияет на результат.

const start = DateTime.fromISO("2026-01-01T00:00:00.000");
const end = DateTime.fromISO("2026-01-01T00:00:01.000");

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

interval.contains(DateTime.fromMillis(start.toMillis())); // true
interval.contains(DateTime.fromMillis(end.toMillis()));   // false

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

Проверка доступности ресурса по времени

if (workingHours.contains(DateTime.now())) {
  // сервис доступен
}

Фильтрация событий

const events = allEvents.filter(event =>
  event.interval.contains(DateTime.now())
);

Валидация пользовательского ввода

function isBookingAllowed(interval, date) {
  return interval.contains(date);
}

Сравнение с ручной проверкой

Эквивалент без contains() выглядел бы так:

const dateMillis = date.toMillis();

dateMillis >= start.toMillis() && dateMillis < end.toMillis();

Метод contains() инкапсулирует эту логику, снижая вероятность ошибок и повышая читаемость кода.


Особенности и ограничения

  • Работает только с объектами Interval
  • Не поддерживает проверки «частичного пересечения» (для этого используется overlaps)
  • Не модифицирует интервал и не возвращает новые значения
  • Требует корректных DateTime объектов Luxon

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

Если передан некорректный аргумент:

interval.contains(null);

результат будет false, так как значение не может быть интерпретировано как дата.


Связанные методы Interval

  • overlaps() — проверка пересечения интервалов
  • engulfs() — полное включение одного интервала в другой
  • abutsStart() и abutsEnd() — проверка касания границ
  • isBefore() и isAfter() — относительное положение интервалов