我想检查'mm/dd/yyyy'格式的有效日期。当我用isValidDateTime('12/10/2012')
调用下面的函数时,它返回false。你能告诉我有什么问题吗?
function isValidDateTime($dateTime)
{
if (preg_match("/^('d{2})/('d{2})/('d{4}) ([0-5][0-9]):([0-5][0-9]):([01][0-9]|2[0-3])$/", $dateTime, $matches)) {
if (checkdate($matches[1], $matches[3], $matches[2])) {
return true;
}
}
return false;
}
这里有一个更简单的方法来完成日期验证…它不验证mm/dd/yyyy格式,但也不需要验证。
DateTime
构造函数在传递无效日期字符串时抛出异常。一旦你有一个有效的日期,你可以使用DateTime::format()
输出日期在任何你想要的格式。
$str = 'bad date';
try {
$date = new DateTime($str);
echo $date->format('m/d/Y');
// do stuff
} catch(Exception $e) {
echo "The date '$str' is not valid";
}
isValidDateTime('12/10/2012')
将不符合preg_match
条件,因为您没有提供一天中的时间。
此外,由于您在正则表达式中使用/
作为分隔符,因此必须转义所有其他斜杠,例如,使用('d{2})'/('d{2})
而不是('d{2})/('d{2})
。
将通过此检查的字符串看起来像这样:01/02/2011 34/56/12
我不认为这是你想测试的,如果你只是想测试字符串"mm/dd/yyyy",使用这个:
/^('d{2})'/('d{2})'/('d{4})$/
- 您必须转义斜杠(
/
->'/
) -
checkdate()
的定义为:$month, $day, $year
(交换第二个和第三个参数)。
function isValidDateTime($dateTime)
{
if (preg_match("/^('d{2})'/('d{2})'/('d{4}) ([0-5][0-9]):([0-5][0-9]):([01][0-9]|2[0-3])$/", $dateTime, $matches)) {
if (checkdate($matches[1], $matches[3], $matches[2])) {
return true;
}
}
return false;
}
var_dump( isValidDateTime('12/14/2011 00:00:00') ); // true
var_dump( isValidDateTime('12/14/s2011 00:00:00') ); // false