Почему 31 февраля переводится в 3 марта?
используйте DateTime::getLastErrors() для проверки.
как пример: https://ideone.com/ddxW1J
Можно получать количество дней в месяце и если день месяца больше чем дней в месяце, то возвращать ошибку.
https://www.php.net/manual/ru/function.cal-days-in...