使用php验证无效的日期字符

时间:2014-07-24 08:40:57

标签: php validation

我有这个用于验证日期格式的php函数:

 function _CHECK_DATEFORMAT_($date, $format='YYYY/MM/DD')
   {
    switch( $format )
    {
        case 'YYYY/MM/DD':
        case 'YYYY-MM-DD':
        list( $y, $m, $d ) = preg_split( '/[-\.\/ ]/', $date );
        break;

        case 'YYYY/DD/MM':
        case 'YYYY-DD-MM':
        list( $y, $d, $m ) = preg_split( '/[-\.\/ ]/', $date );
        break;

        case 'DD-MM-YYYY':
        case 'DD/MM/YYYY':
        list( $d, $m, $y ) = preg_split( '/[-\.\/ ]/', $date ); //3715 LINE
        break;

        case 'MM-DD-YYYY':
        case 'MM/DD/YYYY':
        list( $m, $d, $y ) = preg_split( '/[-\.\/ ]/', $date );
        break;

        case 'YYYYMMDD':
        $y = substr( $date, 0, 4 );
        $m = substr( $date, 4, 2 );
        $d = substr( $date, 6, 2 );
        break;

        case 'YYYYDDMM':
        $y = substr( $date, 0, 4 );
        $d = substr( $date, 4, 2 );
        $m = substr( $date, 6, 2 );
        break;

        default:
        throw new Exception( "Invalid Date Format" );
    }
    return checkdate( $m, $d, $y ); //3738 Line
}

代码输出:

echo validateDate( '2007-21-04', 'YYYY-DD-MM' )  ? 'good'. "\n" : 'bad' . "\n";

此工作但如果用户输入无效的日期字符,请按此:

echo validateDate( '2007*2104', 'YYYY-DD-MM' )  ? 'good'. "\n" : 'bad' . "\n";
echo validateDate( 'test', 'YYYY-DD-MM' )  ? 'good'. "\n" : 'bad' . "\n";

我看到错误:

Notice: Undefined offset: 2 in C:\xampp\htdocs\cms\functions.php on line 3715

Notice: Undefined offset: 1 in C:\xampp\htdocs\cms\functions.php on line 3715

Warning: checkdate() expects parameter 2 to be long, string given in C:\xampp\htdocs\cms\functions.php on line 3738

如何在检查验证日期格式之前验证字符?

3 个答案:

答案 0 :(得分:1)

试试这个:

更好的类,无需DateTime函数验证和格式化日期:

http://www.tonymarston.net/php-mysql/dateclass.html

或者

您可以使用PHP DateTime课程

function validateDate($date)
{
    $d = DateTime::createFromFormat('Y/m/d', $date);
    return $d && $d->format('Y/m/d') == $date;
}

函数已从此answerphp.net

复制

答案 1 :(得分:0)

传递的

date显然可能包含1或2个斜杠/缩误,导致list分配不合适。

警告是因为checkdate需要整数参数。

return checkdate( intval($m), intval($d), intval($y) ); //3738 Line

答案 2 :(得分:0)

您可以使用本机php类DateTime将特殊格式的日期字符串转换为日期

function _CHECK_DATEFORMAT_($date, $format='YYYY/MM/DD')
   {
    switch( $format )
    {
        case 'YYYY/MM/DD':
            $n_format="Y/m/d";
            break;
        case 'YYYY-MM-DD':
            $n_format="Y-m-d";
            break;
        case 'YYYY/DD/MM':
            $n_format="Y/d/m";
            break;
        case 'YYYY-DD-MM':
            $n_format="Y-d-m";
            break;
        case 'DD-MM-YYYY':
            $n_format="d-m-Y";
            break;
        case 'DD/MM/YYYY':
            $n_format="d/m/Y";
            break;
        case 'MM-DD-YYYY':
            $n_format="m-d-Y";
            break;
        case 'MM/DD/YYYY':
            $n_format="m/d/Y";
            break;
        case 'YYYYMMDD':
            $n_format="Ymd";
            break;
        case 'YYYYDDMM':
            $n_format="Ydm";
            break;
        default:
        throw new Exception( "Invalid Date Format" );
    }
    $date=DateTime::createFromFormat($n_format, $date);
    if(!$date){
        throw new Exception('Invalid Date by format '.$format);
    }
    $m=$date->format('m');
    $d=$date->format('d');
    $y=$date->format('Y');
    return checkdate( $m, $d, $y ); //3738 Line
}