<?php
function isValidDate(string $date, string $format = 'm/d/Y', string $yearPadding = '19'): bool {
$date = preg_replace_callback(
'~^(\d+)(\D)(\d+)\2(\d{2}|\d{4})$~',
fn($m) => sprintf('%02d/%02d/%d', $m[1], $m[3], str_pad($m[4], 4, $yearPadding, STR_PAD_LEFT)),
$date
); // sanitize
$d = DateTime::createFromFormat($format, $date); // attempt to parse
return $d && $d->format($format) === $date; // check if formatted string is same as sanitized string
}
$tests = [
'1-1-1992',
'1-1-92',
'1-01-1992',
'1-01-92',
'01-1-1992',
'01-1-92',
'01-01-1992',
'01-01/92',
'1/1/1992',
'1/1/92',
'1/01/1992',
'1/01/92',
'01/1/199',
'01/1/92',
'01/01/1992',
'01/01/92'
];
var_export(array_map('isValidDate', $tests));
- Output for 7.4.0 - 7.4.33, 8.0.1 - 8.0.30, 8.1.0 - 8.1.28, 8.2.0 - 8.2.18, 8.3.0 - 8.3.7
- array (
0 => true,
1 => true,
2 => true,
3 => true,
4 => true,
5 => true,
6 => true,
7 => false,
8 => true,
9 => true,
10 => true,
11 => true,
12 => false,
13 => true,
14 => true,
15 => true,
)
preferences:
126.86 ms | 403 KiB | 122 Q