Как проверить, что дата правильная
Короткий ответ
Разберите строку по формату и убедитесь, что обратно получается та же строка:
<?php
function isValidDate(string $value, string $format = 'd.m.Y'): bool
{
$date = DateTimeImmutable::createFromFormat($format, $value);
return $date !== false && $date->format($format) === $value;
}
var_dump(isValidDate('30.01.2025'));
var_dump(isValidDate('31.02.2025'));
var_dump(isValidDate('tomorrow'));Результат:
bool(true)
bool(false)
bool(false)Зачем сверять результат
PHP сам «исправляет» несуществующие даты: 31 февраля превращается в начало марта, и ошибки нет:
<?php
echo DateTimeImmutable::createFromFormat('d.m.Y', '31.02.2025')->format('d.m.Y');Результат:
03.03.2025Отдельные числа
Если день, месяц и год пришли по отдельности, хватит checkdate():
<?php
var_dump(checkdate(2, 31, 2025));Результат:
bool(false)Функции из этого ответа
- checkdate — Проверяет, существует ли такая дата.
- DateTimeImmutable — Объект даты и времени, который нельзя изменить: каждое действие возвращает новый объект.
- strtotime — Превращает текстовое описание даты в метку времени.