Работа с временными интервалами в JavaScript почти всегда выходит за рамки простой проверки строк. Периоды времени требуют согласованности форматов, корректного сравнения границ и учёта нюансов календаря: часовые пояса, переходы между датами, локальные форматы представления. Библиотека Validator.js предоставляет набор инструментов, которые позволяют строить базовую и расширяемую систему валидации временных значений.
В контексте проверки периодов времени важно понимать, что любая временная сущность в прикладной логике сводится к одному из трёх вариантов:
2026-05-11T10:30:00Z)Основная проблема при валидации — не сам факт существования даты, а её сопоставимость с другими значениями.
Validator.js ориентирован на работу со строками, поэтому временные значения обычно проверяются через предопределённые или комбинированные правила.
Перед тем как анализировать интервалы, необходимо убедиться, что входные данные представляют собой валидные даты.
Наиболее часто используется ISO 8601 как универсальный формат:
2026-05-112026-05-11T14:00:00Z2026-05-11T14:00:00+06:00В Validator.js для таких проверок применяется:
isISO8601(str) — проверка строки на соответствие
стандартуisDate(str) — более широкая проверка, допускающая
разные форматыПример логики:
import validator from "validator";
validator.isISO8601("2026-05-11T14:00:00Z"); // true
validator.isISO8601("11-05-2026"); // false
Использование строгого формата критично при работе с интервалами, поскольку любые отклонения приводят к некорректному сравнению границ.
Период времени определяется двумя значениями:
start)end)Основное правило корректного интервала:
начало всегда должно быть меньше конца
Для этого используется сравнение через функции isBefore
и isAfter.
В Validator.js:
isBefore(date, dateToCompare) — проверяет, что первая
дата раньше второйisAfter(date, dateToCompare) — проверяет, что первая
дата позже второйПример:
validator.isBefore("2026-05-10", "2026-05-11"); // true
validator.isAfter("2026-05-12", "2026-05-11"); // true
Типовая проверка интервала:
function isValidInterval(start, end) {
return validator.isISO8601(start) &&
validator.isISO8601(end) &&
validator.isBefore(start, end);
}
Особый случай — когда начало и конец совпадают. Такие интервалы могут быть:
Проверка равенства обычно реализуется через комбинацию:
Validator.js не предоставляет отдельной функции строгого равенства дат, поэтому используется приведение:
function isZeroLengthInterval(start, end) {
return new Date(start).getTime() === new Date(end).getTime();
}
Валидация периодов часто требует ограничения по длине:
Логика строится на вычислении разницы:
function getDurationMs(start, end) {
return new Date(end) - new Date(start);
}
Далее проверяется диапазон:
function isValidDuration(start, end, minMs, maxMs) {
const diff = getDurationMs(start, end);
return diff >= minMs && diff <= maxMs;
}
Такая логика выходит за пределы стандартных функций Validator.js, но дополняет её типичный сценарий использования.
Одной из ключевых проблем временных интервалов является неоднозначность временных зон.
Строки:
2026-05-11T10:00:00Z2026-05-11T10:00:00+03:00представляют разные абсолютные моменты времени.
Validator.js не выполняет автоматическую нормализацию часовых поясов, поэтому предварительная обработка обязательна:
DateРасширенная логика включает проверку конфликтов между периодами.
Два интервала [A_start, A_end] и
[B_start, B_end] пересекаются, если:
Пример реализации:
function isOverlap(aStart, aEnd, bStart, bEnd) {
return new Date(aStart) < new Date(bEnd) &&
new Date(aEnd) > new Date(bStart);
}
Такая проверка часто применяется в системах бронирования и расписаний, где важно предотвращать коллизии.
Validator.js позволяет расширять стандартную систему через пользовательские валидаторы.
Пример подхода:
const customRules = {
isBusinessHours: (value) => {
const date = new Date(value);
const hours = date.getUTCHours();
return hours >= 9 && hours <= 18;
}
};
Такая модель позволяет накладывать дополнительные ограничения:
При работе с периодами времени наиболее часто возникают следующие проблемы:
Validator.js помогает минимизировать часть ошибок на уровне формата, но не устраняет необходимость явной бизнес-логики.
Реальные сценарии обычно объединяют несколько условий:
Пример комплексной функции:
function validatePeriod(start, end) {
return validator.isISO8601(start) &&
validator.isISO8601(end) &&
validator.isBefore(start, end) &&
!isOverlapWithExisting(start, end);
}
Такая композиция делает Validator.js частью более широкой системы контроля данных, а не единственным механизмом проверки.