【问题标题】:How can I create a php function out this date validation code?如何使用此日期验证代码创建 php 函数?
【发布时间】:2012-12-01 21:21:08
【问题描述】:

我有一段代码可以在没有使其成为函数的情况下工作。但是,当我把它变成一个函数时,它总是返回 false。顾名思义,这个函数的目的是检查日期是否有效。谁能告诉我代码有什么问题?

function is_valid_date($a) {
//date format Y-m-d H:i:s
if(preg_match('/^((19|20)\\d\\d)-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]\d|2[0123]):([0-5]\d):([0-5]\d)$/', $a)){ 
    list( $_date , $_time ) = explode(' ',$a);
    list ($year,$month,$day) = explode("-",$_date);
    list($hour,$minute,$second) = explode(":",$_time);

    if ($day == "31" && ($month == "4" || $month == "6" || $month == "9" || $month == "11" || $month == "04" || $month == "06" || $month == "09" ))  {
        return false;
    } elseif ($month == "2" || $month == "02") {
            if($year % 4==0){
                if($day == "30" || $day == "31"){
                    return false;
                } else {
                    return true;
                }
            }else{
                if($day == "29" || $day == "30" || $day == "31"){
                    return false;
                } else {
                    return true;
                }
            }
    }

}else{
    return false;

}
}

当我尝试时

if (is_valid_date("2012-12-02 15:30:00")) { echo "valid date";} 

什么都没有打印出来。

【问题讨论】:

  • 我看到你的函数只能返回true else if month=2
  • 既然 PHP 已经全部内置,为什么还要编写自己的日期验证例程?

标签: php validation function date


【解决方案1】:

下面使用checkdate有什么问题?

<?php
    function is_valid_date($date) {
        if (preg_match('/^((19|20)\\d\\d)-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]\d|2[0123]):([0-5]\d):([0-5]\d)$/', $date, $matches)){
            return checkdate($matches[3], $matches[4], $matches[1]);
        }
        return false;
    }
    var_dump(is_valid_date("2012-12-02 15:30:00")); //true
?>

这将匹配以下内容:

2012-10-13 00:00:00
1990-02-30 12:34:56

但不是

15:30:00
2012-12-02
2012/12/02 15:30:00
2012-13-02 15:30:00

Click here to see it running online

【讨论】:

  • 我猜这完全符合预期。但是 $matches 3 4 和 1 是什么?
  • @jinni 如您所见,我在preg_match 调用中添加了, $matches 参数。这意味着括号中的所有内容都“匹配”并在此 $match 数组中输出,现在看起来如下所示(使用 print_r,来自 2012-12-02 15:30:00):Array( [0] =&gt; 2012-12-02 15:30:00 [1] =&gt; 2012 [2] =&gt; 20 [3] =&gt; 12 [4] =&gt; 02 [5] =&gt; 15 [6] =&gt; 30 [7] =&gt; 00) 表示第 3 个是月份,第 4 个是日期,第一个参数是年份。您可以在preg_match 手册页上查看更多信息:php.net/manual/en/function.preg-match.php
【解决方案2】:

return true;

在函数结束之前(最后一个大括号 } 之前)。否则,在某些情况下,不会返回任何内容,并将其视为false

完整代码:

function is_valid_date($a) {
//date format Y-m-d H:i:s
if(preg_match('/^((19|20)\\d\\d)-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]\d|2[0123]):([0-5]\d):([0-5]\d)$/', $a)){ 
    list( $_date , $_time ) = explode(' ',$a);
    list ($year,$month,$day) = explode("-",$_date);
    list($hour,$minute,$second) = explode(":",$_time);

    if ($day == "31" && ($month == "4" || $month == "6" || $month == "9" || $month == "11" || $month == "04" || $month == "06" || $month == "09" ))  {
        return false;
    } elseif ($month == "2" || $month == "02") {
            if($year % 4==0){
                if($day == "30" || $day == "31"){
                    return false;
                } else {
                    return true;
                }
            }else{
                if($day == "29" || $day == "30" || $day == "31"){
                    return false;
                } else {
                    return true;
                }
            }
    }

}else{
    return false;

}
    return true;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-22
    • 1970-01-01
    • 2022-10-31
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2012-08-15
    • 2015-12-08
    相关资源
    最近更新 更多