В работе с временными интервалами в Day.js ключевую роль играет корректное определение границ диапазона. Любое сравнение дат сводится к вопросу включения или исключения граничных значений, а также к выбору уровня точности: миллисекунды, секунды, дни или более крупные единицы времени.
Временной интервал задаётся двумя точками:
Поведение сравнения определяется тем, входят ли эти границы в допустимый диапазон:
На уровне логики это напрямую влияет на результат фильтрации, проверок доступности, валидации дат и построения временных окон.
В Day.js базовые методы сравнения формируют основу работы с границами:
isBeforeisAfterisSamedayjs('2026-01-10').isBefore('2026-01-20'); // true
dayjs('2026-01-20').isAfter('2026-01-10'); // true
dayjs('2026-01-20').isSame('2026-01-20'); // true
Эти методы по умолчанию работают с исключающей логикой относительно равенства: совпадающие значения не считаются «до» или «после».
Исключающая логика означает, что границы интервала не входят в диапазон.
Пример интервала:
(10 января, 20 января)
Значения:
В чистом Day.js такая логика реализуется через комбинацию
isAfter и isBefore:
const isInRange = (date, start, end) =>
dayjs(date).isAfter(start) && dayjs(date).isBefore(end);
Подобный подход даёт строгие границы, полезные в финансовых расчётах, логах событий и дедлайнах.
Включающая логика допускает попадание значения на границы интервала.
[10 января, 20 января]
Теперь:
Для реализации используются дополнительные методы из плагинов:
isSameOrBeforeisSameOrAfterimport isSameOrBefore from 'dayjs/plugin/isSameOrBefore';
import isSameOrAfter from 'dayjs/plugin/isSameOrAfter';
dayjs.extend(isSameOrBefore);
dayjs.extend(isSameOrAfter);
const isInRange = (date, start, end) =>
dayjs(date).isSameOrAfter(start) && dayjs(date).isSameOrBefore(end);
Такая форма применяется в бизнес-логике календарей, расписаний и периодов подписок, где границы считаются валидными значениями.
Наиболее компактный способ работы с границами в Day.js реализуется
через плагин isBetween.
import isBetween from 'dayjs/plugin/isBetween';
dayjs.extend(isBetween);
Синтаксис:
dayjs(date).isBetween(start, end, unit, inclusivity);
Параметр inclusivity управляет типом границ:
() — исключающие границы[] — включающие границы[) — левая включена, правая исключена()] — левая исключена, правая включенаПримеры:
dayjs('2026-01-15').isBetween('2026-01-10', '2026-01-20');
// false по умолчанию (исключающие границы)
dayjs('2026-01-10').isBetween('2026-01-10', '2026-01-20', null, '[]');
// true
dayjs('2026-01-20').isBetween('2026-01-10', '2026-01-20', null, '[)');
// false
dayjs('2026-01-10').isBetween('2026-01-10', '2026-01-20', null, '[)');
// true
Частая проблема при работе с границами — неоднозначность времени внутри суток.
dayjs('2026-01-10')
фактически содержит временную компоненту (00:00:00.000), что влияет на сравнение.
Для устранения погрешностей применяются:
dayjs('2026-01-10').startOf('day')
dayjs('2026-01-10').endOf('day')
Пример диапазона дня:
const start = dayjs('2026-01-10').startOf('day');
const end = dayjs('2026-01-10').endOf('day');
Это гарантирует корректность включающих границ при сравнении событий внутри суток.
В практических сценариях часто используются полуоткрытые интервалы:
[start, end) — включающая левая, исключающая
правая(start, end] — исключающая левая, включающая
праваяТакая модель устраняет пересечения между соседними интервалами.
Пример:
const isActive = (date, start, end) =>
dayjs(date).isSameOrAfter(start) && dayjs(date).isBefore(end);
Такой подход гарантирует, что момент окончания одного интервала не пересекается с началом следующего.
Точность сравнения влияет на результат не меньше самой логики включения.
dayjs('2026-01-10 10:00').isSame('2026-01-10 12:00', 'day');
При указании единицы измерения ('day',
'month', 'year') сравнение игнорирует более
мелкие компоненты времени. Это фактически расширяет границы до уровня
выбранной точности.
Пример диапазона по дням:
dayjs('2026-01-10 00:00').isSame(dayjs('2026-01-10 23:59'), 'day'); // true
Работа с массивами дат обычно строится через комбинацию условий включения и исключения:
const dates = [
'2026-01-09',
'2026-01-10',
'2026-01-15',
'2026-01-21'
];
const filtered = dates.filter(d =>
dayjs(d).isSameOrAfter('2026-01-10') &&
dayjs(d).isBefore('2026-01-20')
);
Результат:
Здесь используется полуоткрытый интервал
[start, end).
Основные источники некорректного поведения:
Пример проблемы:
dayjs('2026-01-10').isBefore('2026-01-10 00:00:00'); // false
Хотя логически ожидается равенство, фактическое время совпадает, и поведение зависит от точности интерпретации.
Для устойчивой работы с границами применяется нормализация:
startOf(unit)endOf(unit)const start = dayjs('2026-01-10').startOf('day');
const end = dayjs('2026-01-20').endOf('day');
const isValid = (d) =>
dayjs(d).isBetween(start, end, null, '[]');
Такая форма устраняет неоднозначность включения граничных дат и делает интервал детерминированным при любых входных данных.