Как проверить, что дата корректна
Короткий ответ
Внутри недействительной даты — NaN. Проверьте это через getTime():
const isValidDate = (date) => !Number.isNaN(date.getTime());
console.log(isValidDate(new Date('2025-06-15T10:00')));
console.log(isValidDate(new Date('hello')));Результат:
true
falseСтрока вида YYYY-MM-DD
new Date() тихо переносит 30 февраля на март. Соберите дату из частей и проверьте, что они не изменились:
const isValidYmd = (value) => {
const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value);
if (!match) return false;
const [year, month, day] = match.slice(1).map(Number);
const date = new Date(year, month - 1, day);
return date.getFullYear() === year && date.getMonth() === month - 1 && date.getDate() === day;
};
console.log(isValidYmd('2024-02-29'));
console.log(isValidYmd('2025-02-29'));
console.log(isValidYmd('2025-13-01'));
console.log(isValidYmd('15.06.2025'));Результат:
true
false
false
falseДата в диапазоне
Для даты рождения проверьте ещё, что она не в будущем:
const birth = new Date(2090, 0, 1);
console.log(birth <= new Date() ? 'ok' : 'a date in the future');Результат:
a date in the futureЧастая ошибка
Конструктор Date не сообщает о неправильных днях, а переносит их дальше:
console.log(new Date(2025, 1, 30).toDateString());Результат:
Sun Mar 02 2025Функции из этого ответа
- Date.parse — Разбирает строку с датой и возвращает метку времени.
- Date.prototype.getTime — Возвращает дату как число миллисекунд.