В библиотеке js-joda диапазон значений представлен
классом Range, который моделирует непрерывный интервал
между двумя границами одного типа (например, даты, числа, моменты
времени). Основная задача работы с диапазонами — проверка принадлежности
значения интервалу и анализ взаимного расположения интервалов.
Диапазон в js-joda является неизменяемой структурой и оперирует исключительно сравнимыми значениями, поддерживающими естественный порядок.
Базовая форма диапазона задаётся через нижнюю и верхнюю границы:
Range.of(min, max)
Диапазон создаётся включительным по умолчанию, однако семантика границ зависит от конкретного конструктора и типа данных.
Примеры:
import { Range } from '@js-joda/core';
import { LocalDate } from '@js-joda/core';
const start = LocalDate.of(2025, 1, 1);
const end = LocalDate.of(2025, 12, 31);
const range = Range.of(start, end);
Диапазон фиксирует порядок: min <= max. При нарушении
порядка возникает ошибка времени выполнения.
Основной механизм проверки вхождения реализован методом:
range.contains(value)
Он возвращает логическое значение, определяющее, находится ли переданное значение внутри интервала с учётом границ.
const range = Range.of(
LocalDate.of(2025, 1, 1),
LocalDate.of(2025, 12, 31)
);
range.contains(LocalDate.of(2025, 6, 15)); // true
range.contains(LocalDate.of(2024, 12, 31)); // false
range.contains(LocalDate.of(2026, 1, 1)); // false
Диапазон может быть:
В js-joda также применяются специализированные конструкторы:
Range.ofClosed(min, max)
Range.ofOpen(min, max)
Range.ofOpenClosed(min, max)
Range.ofClosedOpen(min, max)
const range = Range.ofClosed(
LocalDate.of(2025, 1, 1),
LocalDate.of(2025, 1, 10)
);
range.contains(LocalDate.of(2025, 1, 1)); // true
range.contains(LocalDate.of(2025, 1, 10)); // true
const range = Range.ofOpen(
LocalDate.of(2025, 1, 1),
LocalDate.of(2025, 1, 10)
);
range.contains(LocalDate.of(2025, 1, 1)); // false
range.contains(LocalDate.of(2025, 1, 10)); // false
js-joda поддерживает диапазоны для всех основных типов времени:
LocalDateLocalDateTimeInstantYearMonthZonedDateTimeimport { Instant, Range } from '@js-joda/core';
const start = Instant.parse('2025-01-01T00:00:00Z');
const end = Instant.parse('2025-01-02T00:00:00Z');
const range = Range.of(start, end);
range.contains(Instant.parse('2025-01-01T12:00:00Z')); // true
Диапазон опирается на естественный порядок элементов через метод
compareTo. Это означает:
Пример некорректной логики:
Range.of(LocalDate.now(), Instant.now()); // ошибка несовместимых типов
Проверка принадлежности имеет строгую семантику:
null значения не допускаются и приводят к ошибкеПример поведения на границах:
const range = Range.ofClosed(
LocalDate.of(2025, 5, 1),
LocalDate.of(2025, 5, 10)
);
range.contains(LocalDate.of(2025, 5, 1)); // true
range.contains(LocalDate.of(2025, 5, 10)); // true
Хотя основной акцент делается на contains, часто
используется проверка пересечения:
range.isConnected(otherRange)
или логика через:
range.encloses(otherRange)
Эти методы позволяют определить отношение диапазонов без проверки конкретного значения.
Проверка contains применяется в следующих сценариях:
Пример фильтрации:
const events = [
LocalDate.of(2025, 1, 1),
LocalDate.of(2025, 6, 1),
LocalDate.of(2026, 1, 1)
];
const range = Range.ofClosed(
LocalDate.of(2025, 1, 1),
LocalDate.of(2025, 12, 31)
);
const filtered = events.filter(e => range.contains(e));
Диапазон, в котором границы совпадают при открытом типе, может считаться пустым:
const range = Range.ofOpen(
LocalDate.of(2025, 1, 1),
LocalDate.of(2025, 1, 1)
);
range.contains(LocalDate.of(2025, 1, 1)); // false
Это важно учитывать при динамическом формировании интервалов.
Операция contains имеет константную сложность:
Это делает диапазоны пригодными для частых проверок в высоконагруженных сценариях, включая потоковую обработку событий и фильтрацию временных данных.