2010-01-18 101 views
15

我想驗證使用PHP的日期。驗證日期格式在php

我想下面的格式是有效的:

d/m/yy 
d/m/yyyy 
dd/m/yy 
dd/m/yyyy 
d/mm/yy 
d/mm/yyyy 
dd/mm/yy 
dd/mm/yyyy 

我試過很多的正則表達式和了checkdate不同的變化()函數。目前,我有這樣的事情:

function _date_is_valid($str) 
{ 
    if(strlen($str) == 0) 
     return TRUE; 
    if(substr_count($str,'/') == 2) 
    { 
     if (preg_match("/^((((31\/(0?[13578]|1[02]))|((29|30)\/(0?[1,3-9]|1[0-2])))\/(1[6-9]|[2-9]\d)?\d{2})|(29\/0?2\/(((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))|(0?[1-9]|1\d|2[0-8])\/((0?[1-9])|(1[0-2]))\/((1[6-9]|[2-9]\d)?\d{2}))/", $str)) 
     { 
      $datearray = explode('/',$str); 
      if($datearray[2] > 2030) 
       return FALSE; 
      return checkdate($datearray[1], $datearray[0], $datearray[2]); 
     } 
     else 
     { 
      return FALSE; 
     } 
    } 
    return FALSE; 
} 

然而,這驗證帶像11/11/200和11 /200分之11#日期

我如何驗證日期,以匹配要求的格式?

編輯:我可以檢查datearray [2]介於10和30之間,2010和2030.但有沒有辦法使用正則表達式來檢查它?

編輯1:在strlen($ str)上返回TRUE == 0是因爲我希望用戶能夠添加事件而不知道事件何時發生,以便其他人可以限定日程並將事件分配到特定日期


只是爲了記錄。我落得這樣做:

function _date_is_valid($str) 
{ 
    if(strlen($str) == 0) //To accept entries without a date 
     return TRUE; 
    if(substr_count($str,'/') == 2) 
    { 
     list($d,$m,$y) = explode('/',$str); 
     if(($y >= 10 && $y <= 30) || ($y >= 2010 && $y <= 2030)) 
     { 
      return checkdate($m,$d,$y); 
     } 
    } 
    return FALSE; 
} 

感謝您的答案

回答

24
function _date_is_valid($str) { 
    if (substr_count($str, '/') == 2) { 
     list($d, $m, $y) = explode('/', $str); 
     return checkdate($m, $d, sprintf('%04u', $y)); 
    } 

    return false; 
} 
+0

應該是checkdate(),而不是check_date()。除此之外,我看起來不錯。 +1 – 2010-01-18 14:29:40

+0

如果你沒有檢查'/'的計數它會拋出一個PHP通知或警告在無效的字符串 – antpaw 2010-01-18 14:31:33

+0

我修改了這個有點不驗證日期後,某些年作爲PHP checkdate()驗證像20111年這種情況不是我想要的 – LukeP 2010-01-18 14:51:52

2

試試這個:

function _date_is_valid($str) { 
    if (strlen($str) == 0) { 
     return TRUE; 
    } 
    return preg_match('/^(\d{1,2})\/(\d{1,2})\/((?:\d{2}){1,2})$/', $str, $match) && checkdate($match[2], $match[1], $match[3]) && $match[2] <= 2030; 
} 
+0

爲什麼返回TRUE ? – erenon 2010-01-18 14:28:54

+0

我想允許日期留空或以有效格式。這是某種事件日曆,您可以預訂某個日期的活動或預訂活動,並且稍後其他人將日期分配給日期 – LukeP 2010-01-18 14:36:31

+0

不檢查日期或月份是否有效。 – 2010-01-18 14:41:14

8

如果它總是會日期/月/年你可以使用checkdate

function _date_is_valid($str) 
{ 
    $array = explode('/', $str); 

    $day = $array[0]; 
    $month = $array[1]; 
    $year = $array[2]; 

    $isDateValid = checkdate($month, $day, $year); 
    return $isDateValid; 
} 
+0

應該是checkdate(),而不是check_date()。你可能想爲$ array索引做一個isset()。除此之外,我看起來不錯。+1 – 2010-01-18 14:32:02

+0

哦,是的,你是對的,它是checkdate(),從問題中複製而不檢查它。謝謝 – marvin 2010-01-18 14:36:41

+0

如果沒有兩個分離'/'怎麼辦? – Gumbo 2010-01-18 15:14:14

0

if(strtotime($str) !== FALSE) $valid = TRUE;

+1

-1:OP對接受的格式非常具體。您的解決方案允許更多格式。 – 2010-01-18 14:27:45

+1

並且dd/mm/yyyy和mm/dd/yyyy之間存在問題 – LukeP 2010-01-18 14:34:49

1

我一直在改變上面的馬丁答案,它會驗證任何類型的日期和返回你喜歡的格式。

只需通過編輯腳本strftime(「10-10-2012」,strtotime($ dt))下面一行來更改格式;

<?php 

     echo is_date("13/04/10"); 

     function is_date($str) 
     { 
     $flag = strpos($str, '/'); 

     if(intval($flag)<=0){ 
      $stamp = strtotime($str); 
     }else { 
      list($d, $m, $y) = explode('/', $str);  
      $stamp = strtotime("$d-$m-$y"); 
     } 
      //var_dump($stamp) ; 

      if (!is_numeric($stamp)) 
      { 
      //echo "ho" ; 
      return "not a date" ;  
      } 

      $month = date('n', $stamp); // use n to get date in correct format 
      $day = date('d', $stamp); 
      $year = date('Y', $stamp); 

      if (checkdate($month, $day, $year)) 
      { 
      $dt = "$year-$month-$day" ; 
      return strftime("%d-%b-%Y", strtotime($dt)); 
      //return TRUE; 
      }else { 
      return "not a date" ; 
      } 
     } 

    ?> 
1

我做的事,以驗證它是簡單

function dateValidate($pDate) { 
    if(empty($pDate)) 
     return true; 
    $chDate = date('Y-m-d', strtotime($pDate)); 
    if($chDate != '1970-01-01') 
     return true; 
    else 
     return false; 
} 

你可以找到它使用正則表達式太

4

一個簡單的方法來做到這一點

<?php 
    if(!$formated_date = date_create_from_format('Y-m-d',$dateVar)) 
+1

你是一個明星,這幫助我很好。良好的工作 – humphrey 2014-05-17 22:10:38