Работа с датами в схемах валидации требует точного контроля границ
допустимых значений. В библиотеке Yup это реализуется через методы
ограничения диапазона — min() и max(),
применяемые к типу date(). Эти методы позволяют задавать
нижнюю и верхнюю границу допустимой даты и активно используются в
формах, API-валидации и бизнес-логике.
Тип date() в Yup создаёт валидатор, который ожидает
значение, приводимое к объекту Date.
import * as yup from 'yup';
const schema = yup.object({
birthday: yup.date()
});
На этом уровне проверяется только корректность даты как типа данных. Ограничения диапазона отсутствуют.
Метод min() задаёт минимально допустимую дату. Любое
значение, которое меньше указанной границы, считается невалидным.
const schema = yup.object({
startDate: yup.date().min(new Date('2024-01-01'))
});
В этом примере все даты ранее 1 января 2024 года будут отклонены.
getTime())DateDateМетод max() задаёт верхнюю границу допустимого
диапазона.
const schema = yup.object({
endDate: yup.date().max(new Date('2024-12-31'))
});
Любая дата позже 31 декабря 2024 года будет считаться невалидной.
Чаще всего ограничения используются совместно, формируя допустимый интервал дат.
const schema = yup.object({
eventDate: yup.date()
.min(new Date('2024-01-01'))
.max(new Date('2024-12-31'))
});
Такой подход фиксирует строгий диапазон, например, для выбора даты события в пределах одного календарного года.
Границы могут задаваться динамически относительно текущего времени.
const schema = yup.object({
futureDate: yup.date()
.min(new Date())
});
Здесь запрещаются любые прошедшие даты.
Аналогично можно ограничивать прошлое:
const schema = yup.object({
pastDate: yup.date()
.max(new Date())
});
Для предотвращения «застывших» значений границы часто вычисляются во время выполнения схемы.
const schema = yup.object({
bookingDate: yup.date()
.min(() => new Date(Date.now() + 24 * 60 * 60 * 1000))
});
В этом случае минимальная дата всегда будет «завтра», независимо от момента загрузки модуля.
min() и max() поддерживают передачу
сообщений валидации вторым аргументом.
const schema = yup.object({
ageDate: yup.date()
.min(new Date('2000-01-01'), 'Дата слишком ранняя')
.max(new Date('2025-01-01'), 'Дата выходит за допустимый диапазон')
});
Сообщения позволяют явно отделять бизнес-логику от пользовательской интерпретации ошибки.
Yup принимает строки, если они приводимы к корректной дате.
yup.date().min('2024-01-01').max('2024-12-31')
Однако поведение зависит от реализации Date.parse(),
поэтому при строгой валидации предпочтительнее использовать объекты
Date.
Внутреннее сравнение происходит через числовое значение времени.
Ключевые особенности:
Пример потенциальной проблемы:
yup.date().min(new Date('2024-01-01'))
Если входная строка интерпретируется в UTC, а локальная зона сдвигает время назад, дата может неожиданно стать невалидной.
При интеграции с формами диапазоны дат часто используются для ограничения пользовательского ввода.
const schema = yup.object({
checkIn: yup.date().required().min(new Date()),
checkOut: yup.date()
.min(yup.ref('checkIn'))
});
Здесь checkOut не может быть раньше
checkIn, что реализует зависимую валидацию между
полями.
Yup поддерживает динамические зависимости через
ref().
yup.date().min(yup.ref('startDate'))
Такой подход используется для:
Значение, равное min или max, считается
валидным.
yup.date().min(new Date('2024-01-01'))
Дата 1 января 2024 года допустима.
Поведение зависит от дополнительных модификаторов:
required() делает поле обязательнымrequired() допускается undefinednullable() допускает nullyup.date().nullable().min(new Date('2024-01-01'))
Хотя Yup допускает цепочку вызовов в любом порядке, логически важно
учитывать последовательность ограничений, особенно при комбинировании с
transform() или when().
Метод when() позволяет менять границы динамически.
yup.object({
type: yup.string(),
date: yup.date().when('type', {
is: 'event',
then: schema => schema.min(new Date('2024-01-01')),
otherwise: schema => schema.max(new Date())
})
});
Так формируются разные диапазоны в зависимости от состояния данных.
Ограничения min() и max() используются в
задачах:
При использовании фиксированных дат в схемах важно учитывать момент
инициализации модуля. Если границы вычисляются один раз при загрузке,
они могут устареть при длительной работе приложения. Использование
функций в min() и max() решает эту проблему,
обеспечивая актуальность значений на момент валидации.