2012-12-01 19 views
0

我有一段代碼不起作用。但是,當我使它成爲一個函數時,它總是返回false。顧名思義,此功能的目的是檢查日期是否有效。有人可以告訴我代碼有什麼問題嗎?如何在此日期驗證碼中創建一個php函數?

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";} 

沒有什麼是打印。

+1

我看你的函數可以返回TRUE;只有'否則,如果一個月= 2 ' – Andrew

+0

爲什麼在PHP已經內置所有內置的時候編寫自己的日期驗證例程? – Spudley

回答

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

+0

我想這完全按照預期工作。但是什麼是$ 4和1? – jinni

+0

@jinni,你可以看到我爲'preg_match'調用添加了',$ matches'參數。這意味着括號中的所有內容都被「匹配」並在這個'$ match'數組中輸出,現在看起來像下面的樣子(使用'2012-12-02 15:30:00'中的'print_r'):'Array([ 0] => 2012-12-02 15:30:00 [1] => 2012 [2] => 20 [3] => 12 [4] => 02 [5] => 15 [6] => 30 [7] => 00)'意思是第三個是月份,第四個是日期,第一個參數是年份。您可以在'preg_match'手冊頁上看到更多信息:http://php.net/manual/en/function.preg-match.php – h2ooooooo

0

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; 

} 
+0

你能澄清嗎? – jinni