检查有效日期问题


check for valid date issue

我想检查'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})$/
  1. 您必须转义斜杠(/ -> '/)
  2. 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