Проверка вхождения в интервал

Работа с временными интервалами является одной из ключевых задач при обработке дат: фильтрация событий по диапазону, проверка активности подписки, контроль сроков действия токенов, определение попадания метки времени в рабочее окно. В Day.js для этих целей используется плагин isBetween, а также комбинации базовых методов сравнения дат.


Плагин isBetween и его подключение

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

import dayjs from 'dayjs'
import isBetween from 'dayjs/plugin/isBetween'

dayjs.extend(isBetween)

После подключения становится доступен метод:

dayjs().isBetween(start, end, unit?, inclusivity?)

Базовый синтаксис проверки интервала

Метод определяет, находится ли дата между двумя границами:

dayjs('2026-05-10').isBetween('2026-05-01', '2026-05-20')

Результат — булево значение:

  • true — дата входит в диапазон
  • false — дата вне диапазона

Единицы измерения при сравнении

Третьим параметром задаётся точность сравнения:

dayjs('2026-05-10 10:00').isBetween(
  '2026-05-10 00:00',
  '2026-05-10 23:59',
  'day'
)

Поддерживаемые единицы:

  • year
  • month
  • day
  • hour
  • minute
  • second
  • millisecond

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


Включительность границ интервала

Четвёртый параметр управляет тем, включаются ли границы диапазона:

dayjs('2026-05-01').isBetween('2026-05-01', '2026-05-10', null, '[]')

Варианты:

  • () — исключены обе границы (по умолчанию)
  • [] — включены обе границы
  • [) — левая включена, правая исключена
  • () — левая исключена, правая включена

Примеры поведения:

dayjs('2026-05-01').isBetween('2026-05-01', '2026-05-10', null, '[]') // true
dayjs('2026-05-01').isBetween('2026-05-01', '2026-05-10', null, '()') // false

Сравнение дат без учёта времени

При необходимости игнорировать время используется единица day:

dayjs('2026-05-10 23:59').isBetween(
  '2026-05-10 00:00',
  '2026-05-10 12:00',
  'day'
)

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


Использование переменных границ

Интервалы часто задаются динамически:

const start = dayjs().subtract(7, 'day')
const end = dayjs()

const date = dayjs('2026-05-20')

date.isBetween(start, end)

Такой подход применяется в фильтрации последних N дней, недель или месяцев.


Проверка попадания в временные окна

Проверка активности события

const now = dayjs()

const isActive = now.isBetween(
  event.startTime,
  event.endTime,
  'millisecond',
  '[)'
)

Часто используется полуоткрытый интервал [) для исключения двойного срабатывания на границе.


Проверка срока действия

const isValid = dayjs(token.createdAt).isBetween(
  dayjs().subtract(30, 'day'),
  dayjs()
)

Фильтрация массивов по диапазону

Метод активно используется при обработке коллекций:

const events = [
  { date: '2026-05-01' },
  { date: '2026-05-10' },
  { date: '2026-06-01' }
]

const filtered = events.filter(event =>
  dayjs(event.date).isBetween('2026-05-01', '2026-05-31', 'day', '[]')
)

Результатом будет набор событий, попадающих в май.


Альтернативный способ без isBetween

При отсутствии плагина интервал можно проверить через комбинацию isAfter и isBefore:

const date = dayjs('2026-05-10')

const isInside =
  date.isAfter('2026-05-01') &&
  date.isBefore('2026-05-20')

С учётом границ:

const isInsideInclusive =
  (date.isAfter('2026-05-01') || date.isSame('2026-05-01')) &&
  (date.isBefore('2026-05-20') || date.isSame('2026-05-20'))

Особенности сравнения и подводные аспекты

Строгость интервалов

При сравнении учитывается точность, заданная третьим параметром. Без него сравнение идёт вплоть до миллисекунд.


Парсинг строковых дат

Некорректные форматы приводят к невалидным объектам:

dayjs('invalid-date').isBetween('2026-01-01', '2026-12-31')

Результат всегда будет false, так как объект считается недействительным.


Влияние часового пояса

При работе с локальными и UTC-датами возможно смещение:

import utc from 'dayjs/plugin/utc'
dayjs.extend(utc)

dayjs.utc('2026-05-10').isBetween(
  dayjs.utc('2026-05-01'),
  dayjs.utc('2026-05-20')
)

Сравнение становится предсказуемым при унифицированном формате времени.


Работа с границами и пограничными значениями

Особое внимание требуется при совпадении даты с границей интервала:

dayjs('2026-05-10').isBetween(
  '2026-05-10',
  '2026-05-20',
  'day',
  '[)'
)

При использовании [) левая граница считается включённой, что влияет на результат фильтрации.


Сравнение интервалов с разной точностью

При смешивании форматов возможны неожиданные результаты:

dayjs('2026-05-10 12:00').isBetween(
  '2026-05-10',
  '2026-05-11',
  'day'
)

Обе даты приводятся к началу дня, что может расширить фактический диапазон.


Комбинирование с другими методами Day.js

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

  • startOf() — приведение к началу периода
  • endOf() — определение конца периода
  • diff() — вычисление расстояния между датами

Пример нормализации интервала:

const start = dayjs('2026-05-01').startOf('day')
const end = dayjs('2026-05-31').endOf('day')

const result = dayjs('2026-05-15').isBetween(start, end)

Практические сценарии применения

Ограничение доступа по времени

const allowed = dayjs().isBetween(
  subscription.start,
  subscription.end,
  'millisecond',
  '[]'
)

Проверка попадания в расписание

const inWorkingHours = dayjs().isBetween(
  dayjs().hour(9).minute(0),
  dayjs().hour(18).minute(0)
)

Валидация диапазонов дат формы

const validRange = endDate.isAfter(startDate) &&
  startDate.isBetween(minDate, maxDate, 'day', '[]') &&
  endDate.isBetween(minDate, maxDate, 'day', '[]')

Поведение при крайних случаях

  • одинаковые границы интервала при () → всегда false
  • одинаковые границы при [] → всегда true
  • некорректные даты → false
  • отсутствие плагина → метод недоступен

Использование в цепочках обработки данных

const result = data
  .map(item => dayjs(item.date))
  .filter(date =>
    date.isBetween(start, end, 'day', '[]')
  )
  .sort((a, b) => a.diff(b))

Такой подход часто применяется в аналитических и временных выборках.