2011-02-12 78 views
6

如果按以下格式提交日期,則爲$month=2, $day=31, $year= 2010。我如何驗證使用PHP日期函數,如果它是有效的日期或沒有?謝謝。如何使用PHP驗證日期

+0

是否正在通過**文本輸入**字段中輸入或**日期複製下拉菜單**? 通常,對於任何日期明智的,我建議**下拉菜單**,因爲這可以是一個非常簡單和簡單的日期驗證和驗證方式。 – Eli 2011-02-12 15:38:48

+6

@Eli這是怎麼回事?任何人都可以使用螢火蟲或鉻檢查器在下拉菜單中編輯值。您應該_allways_驗證來自瀏覽器的數據。 – Samuel 2012-04-26 19:37:25

回答

1
bool checkdate (int $month , int $day , int $year) 
0

下面是我想出到了checkdate的嚴格性結合()的日期時間的便利性(它把像「下週四」或「項2周前')

如果輸入字符串無效,則返回false。空日期返回爲null,非空日期格式爲MySQL樣式'Y-m-d'。

/** 
* @return variant null for empty date, mysql date string for valid date, or false for invalid date string 
*/ 
function myCheckDate($date) 
{ 
    $result=false; 
    if($date=='') 
    { 
     $result=null; 
    } 
    else 
    { 
     //Best of both worlds 
     // - flexibility of DateTime (next thursday, 2 weeks ago, etc) 
     // - strictness of checkdate (2000-02-31 is not allowed) 
     $m=false; 
     $d=false; 
     $y=false; 
     $parts=date_parse($date); 
     if($parts!==false) 
     { 
      $m=$parts['month']; 
      $d=$parts['day']; 
      $y=$parts['year']; 
     } 
     if($m!==false && $d!==false) 
     { 
      if($y===false) $y=date('Y'); //Default to this year 
      //Try for a specific date - this catches bad entries like 'feb 31, 2000' 
      if(checkdate($m,$d,$y)) $result=sprintf('%04d-%02d-%02d',$y,$m,$d); 
     } 
     else 
     { 
      //Try for something more generic - this allows entries like 'next thursday' 
      $dt=false; 
      try{ $dt=new \DateTime($date); }catch(\Exception $e){ $dt=false; } 
      if($dt!==false) $result=$dt->format('Y-m-d'); 
     } 
    } 
    return $result; 
} 
3
<?php 
function validateDate($date, $format = 'Y-m-d H:i:s'){ 
    $d = DateTime::createFromFormat($format, $date); 
    return $d && $d->format($format) == $date; 
} 
?> 

var_dump(validateDate('2012-02-28 12:12:12')); # true 
var_dump(validateDate('2012-02-30 12:12:12')); # false 
var_dump(validateDate('2012-02-28', 'Y-m-d')); # true 
var_dump(validateDate('28/02/2012', 'd/m/Y')); # true 
var_dump(validateDate('30/02/2012', 'd/m/Y')); # false 

功能,從這個answerphp.net