В работе с датами в 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 предоставляет набор методов сравнения, которые позволяют строить логические цепочки:
isBeforeisAfterisSameКаждый из них может использоваться как элемент более сложной проверки.
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 реализует дополнительные возможности через плагины. В контексте комбинированных проверок особенно важны:
isBetweenisSameOrBeforeisSameOrAfterПосле подключения плагина логика становится более выразительной.
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);
Такое разбиение повышает читаемость сложных составных условий и упрощает тестирование логики.