Joi.date() представляет собой валидатор для работы с
датами в JavaScript. В основе используется стандартный объект
Date, а проверка значений строится вокруг возможности
преобразования входных данных в корректную дату и их дальнейшей
валидации.
import Joi from 'joi';
const schema = Joi.date();
schema.validate('2026-05-10T12:00:00Z');
При включённой конвертации строковые значения автоматически
преобразуются в объект Date, если формат распознаётся
движком JavaScript.
Валидация Joi.date() опирается на возможности
Date.parse() и внутренние механизмы ECMAScript. Основные
поддерживаемые форматы:
Наиболее надёжный и рекомендуемый формат.
Joi.date().validate('2026-05-10T14:30:00Z');
Допустимые варианты:
2026-05-102026-05-10T14:30:00Z2026-05-10T14:30:00+05:00ISO-формат гарантирует предсказуемость при сериализации и передаче данных между системами.
Поддерживаются Unix timestamp в миллисекундах.
Joi.date().validate(1715347200000);
Число интерпретируется как количество миллисекунд с 1 января 1970 года UTC.
Дополнительно:
Joi.date().timestamp().validate(1715347200, 'seconds');
Метод .timestamp() позволяет явно указать единицы
измерения:
milliseconds (по умолчанию)secondsПо умолчанию включена опция convert, позволяющая
преобразовывать строки и числа в объект Date.
const schema = Joi.date();
schema.validate('2026-05-10');
При отключении преобразования проверка становится строгой:
const schema = Joi.date().strict();
schema.validate('2026-05-10'); // ошибка
Метод .strict() запрещает автоматическое приведение
типов.
Joi.date().strict().validate('2026-05-10');
В таком режиме допустимыми значениями считаются только экземпляры
Date.
Joi.date().strict().validate(new Date());
Для контроля временных границ используются методы сравнения.
Joi.date().min('2020-01-01');
Joi.date().max('2030-12-31');
Допустимы также динамические значения:
Joi.date().min('now');
Joi.date().max('now');
now интерпретируется как момент выполнения
валидации.
Joi позволяет задавать относительные ограничения.
const schema = Joi.object({
start: Joi.date(),
end: Joi.date().greater(Joi.ref('start'))
});
Поддерживаются операторы:
.greater().less().min().max()Объект Date в JavaScript хранит время с точностью до
миллисекунд. Joi не изменяет точность, но сравнение выполняется на
уровне timestamp.
Joi.date().validate(new Date('2026-05-10T12:00:00.123Z'));
При необходимости игнорирования времени используется нормализация значений вне Joi (например, обнуление часов).
Joi не выполняет самостоятельную обработку часовых поясов, а
полагается на поведение Date.
Joi.date().validate('2026-05-10T00:00:00+03:00');
Внутренне значение приводится к UTC.
Особенности:
Z фиксируются как UTCНекоторые входные данные автоматически отклоняются:
Joi.date().validate('not-a-date'); // ошибка
Joi.date().validate('2026-13-40'); // ошибка
Если значение не может быть преобразовано в валидный
Date, результат считается невалидным.
По умолчанию:
undefined проходит только при отсутствии
обязательностиnull требует явного разрешенияJoi.date().allow(null);
Joi.date().optional();
Для нестандартных форматов применяется .custom().
Joi.date().custom((value, helpers) => {
const parsed = customParse(value);
if (!parsed) {
return helpers.error('date.invalid');
}
return parsed;
});
Это позволяет обрабатывать форматы вида:
10/05/202610-05-2026Дата часто используется в объектах с дополнительными ограничениями.
const schema = Joi.object({
createdAt: Joi.date().max('now'),
expiresAt: Joi.date().greater(Joi.ref('createdAt'))
});
Подобные схемы обеспечивают контроль жизненного цикла данных.
После успешной валидации результатом становится объект
Date.
const { value } = Joi.date().validate('2026-05-10');
typeof value; // object
value instanceof Date; // true
При необходимости сериализации используется:
value.toISOString();
Некоторые строки могут интерпретироваться неоднозначно:
Joi.date().validate('01-02-03');
Результат зависит от реализации Date.parse() в среде
выполнения, что делает подобные форматы нестабильными.
Joi.array().items(Joi.date().iso());
Метод .iso() ограничивает входные значения строгим
ISO-форматом.
Joi.date().iso().validate('2026-05-10T10:00:00Z');
В этом режиме допускаются только ISO 8601 строки, что повышает предсказуемость обработки данных.
При использовании JSON.stringify:
JSON.stringify({ date: new Date() });
Дата автоматически преобразуется в ISO-строку, что согласуется с поведением Joi при конвертации входных данных.