2010-01-18 104 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