Комбинированные проверки

В работе с датами в Day.js критически важно учитывать не только корректность одного значения, но и совокупность условий, при которых дата считается допустимой. Одиночная проверка через isValid() редко отражает реальную бизнес-логику, поскольку в прикладных задачах дата почти всегда участвует в наборе ограничений: диапазоны, сравнения, временные окна, согласованность нескольких полей.

Базовая проверка валидности как элемент композиции

Фундаментальной точкой входа является метод isValid(). Он определяет, может ли объект Day.js быть интерпретирован как корректная дата.

import dayjs from 'dayjs';

const date = dayjs('2026-05-23');

const valid = date.isValid();

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

Типичный шаблон комбинирования:

const date = dayjs(inputDate);

const isAcceptable = date.isValid() && date.isAfter('2020-01-01');

Здесь уже формируется простейшая комбинированная проверка: корректность парсинга и попадание в допустимый диапазон.

Сравнение дат как основа составных условий

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

  • isBefore
  • isAfter
  • isSame

Каждый из них может использоваться как элемент более сложной проверки.

const date = dayjs('2026-05-23');

const isInFutureWindow =
  date.isAfter(dayjs('2026-01-01')) &&
  date.isBefore(dayjs('2026-12-31'));

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

Включение границ диапазона и логическая точность

Сравнения по умолчанию не включают границы, поэтому при необходимости точной проверки требуется явное расширение логики:

const date = dayjs('2026-01-01');

const isInRange =
  (date.isAfter('2026-01-01') || date.isSame('2026-01-01')) &&
  (date.isBefore('2026-12-31') || date.isSame('2026-12-31'));

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

Использование плагинов для расширенных проверок

Day.js реализует дополнительные возможности через плагины. В контексте комбинированных проверок особенно важны:

  • isBetween
  • isSameOrBefore
  • isSameOrAfter

После подключения плагина логика становится более выразительной.

import isBetween from 'dayjs/plugin/isBetween';
dayjs.extend(isBetween);

const date = dayjs('2026-05-23');

const result = date.isBetween('2026-01-01', '2026-12-31', 'day', '[]');

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

Комбинирование нескольких бизнес-ограничений

В реальных сценариях дата должна удовлетворять сразу нескольким независимым правилам. Например:

  • дата должна быть валидной
  • дата не должна быть в прошлом
  • дата должна попадать в допустимый диапазон публикации
  • дата должна учитывать время суток
const date = dayjs(inputDate);

const now = dayjs();
const start = dayjs('2026-01-01');
const end = dayjs('2026-12-31');

const isAllowed =
  date.isValid() &&
  date.isAfter(now.subtract(1, 'minute')) &&
  date.isBetween(start, end, 'day', '[]');

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

Логические композиции с отрицаниями

Комбинированные проверки нередко включают исключающие условия. Day.js не предоставляет специализированного метода отрицания, поэтому используется стандартная логика JavaScript.

const date = dayjs(inputDate);

const isBlocked =
  !date.isValid() ||
  date.isBefore('2020-01-01') ||
  date.isAfter('2030-01-01');

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

Согласование нескольких дат между собой

Комбинированные проверки часто включают не одну дату, а пару или набор значений: начало и конец периода, дедлайны, интервалы.

const start = dayjs(startDate);
const end = dayjs(endDate);

const isRangeValid =
  start.isValid() &&
  end.isValid() &&
  start.isBefore(end);

Добавление дополнительных условий делает проверку более строгой:

const isStrictRangeValid =
  start.isValid() &&
  end.isValid() &&
  start.isBefore(end) &&
  end.diff(start, 'day') <= 30;

Здесь добавлено ограничение максимальной длины интервала.

Проверки с учётом временных единиц

Day.js позволяет задавать точность сравнения через единицы измерения времени, что важно для составных условий.

const date = dayjs(inputDate);

const isSameDayAsToday =
  date.isSame(dayjs(), 'day');

Комбинирование таких проверок:

const isValidEventTime =
  date.isValid() &&
  date.isAfter(dayjs(), 'minute') &&
  date.isSame(dayjs().add(7, 'day'), 'day');

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

Условные цепочки в прикладной логике

Комбинированные проверки нередко формируются динамически:

function validateDate(date) {
  const d = dayjs(date);

  const rules = [
    d.isValid(),
    d.isAfter('2025-01-01'),
    d.isBefore('2027-01-01'),
  ];

  return rules.every(Boolean);
}

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

Интеграция с внешними проверками

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

const date = dayjs(inputDate);

const isAllowed =
  typeof inputDate === 'string' &&
  date.isValid() &&
  date.isAfter('2024-01-01') &&
  userRole === 'admin';

В подобных конструкциях дата становится лишь одним из элементов более широкой проверки состояния системы.

Проверка пересечения интервалов

Комбинированные проверки включают анализ пересечений временных диапазонов:

const aStart = dayjs(aStartDate);
const aEnd = dayjs(aEndDate);

const bStart = dayjs(bStartDate);
const bEnd = dayjs(bEndDate);

const isOverlap =
  aStart.isBefore(bEnd) &&
  bStart.isBefore(aEnd);

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

Составные проверки с нормализацией данных

Перед выполнением логических операций часто требуется нормализация:

const date = dayjs(inputDate).startOf('day');

const isClean =
  date.isValid() &&
  date.isSameOrAfter(dayjs('2026-01-01')) &&
  date.isSameOrBefore(dayjs('2026-12-31'));

Приведение к началу или концу дня устраняет влияние времени при сравнении дат.

Комбинирование через функциональные предикаты

Для сложных систем удобно выносить проверки в отдельные функции:

const isValidDate = (d) => dayjs(d).isValid();

const isInRange = (d) =>
  dayjs(d).isBetween('2025-01-01', '2026-12-31', 'day', '[]');

const isNotWeekend = (d) => {
  const day = dayjs(d).day();
  return day !== 0 && day !== 6;
};

const isAcceptable =
  isValidDate(input) &&
  isInRange(input) &&
  isNotWeekend(input);

Такое разбиение повышает читаемость сложных составных условий и упрощает тестирование логики.