【问题标题】:Validate date format in php在php中验证日期格式
【发布时间】:2011-01-06 09:27:38
【问题描述】:

我正在尝试使用 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;
}

但是,这会验证日期,例如 200 年 11 月 11 日和 200 年 11 月 11 日#

如何验证日期以匹配所需格式?

编辑:我可以检查 datearray[2] 是否介于 10 和 30 以及 2010 和 2030 之间。但是有没有办法使用正则表达式来检查它?

Edit1: return TRUE on strlen($str) == 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;
}

感谢您的所有回答

【问题讨论】:

    标签: php regex date validation


    【解决方案1】:
    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;
    }
    

    【讨论】:

    • 应该是 checkdate(),而不是 check_date()。除此之外,对我来说看起来不错。 +1
    • 如果你不检查'/'的计数,它会在无效字符串上抛出一个php通知或警告
    • 我修改了这一点,以便在某年之后不验证日期,因为 php checkdate() 验证像 20111 这样的年份,在这种情况下,这不是我想要的
    • 如果没有两个分开的/怎么办?
    【解决方案2】:

    如果它始终是日期/月份/年份,您可以使用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;
    }
    

    【讨论】:

    • 应该是 checkdate(),而不是 check_date()。你可能想为 $array 索引做一个 isset() 。除此之外,对我来说看起来不错。 +1
    • 哦,是的,你是对的,它是 checkdate(),从问题中复制而不检查它。谢谢
    • 如果没有两个分开的/怎么办?
    【解决方案3】:

    一个简单的方法来做到这一点

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

    【讨论】:

      【解决方案4】:

      试试这个:

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

      【讨论】:

      • 我想允许日期为空或有效格式。这是一种活动日历,您可以在其中预订特定日期的活动或预订活动,其他人稍后会为其分配日期
      • 不检查日期或月份是否有效。
      • @Douglas Leeder: checkdate 检查有效日期。
      • 抱歉 - 没有注意到水平滚动。并且 preg_match 适合显示的宽度。
      【解决方案5】:

      我刚刚更改了上面的马丁答案,它将验证任何类型的日期并以您喜欢的格式返回。

      只需编辑下面的脚本 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" ;
                }
               }
      
          ?>
      

      【讨论】:

        【解决方案6】:

        我所做的验证很简单

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

        你也可以用正则表达式找到它

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • -1:OP 对接受哪些格式非常具体。您的解决方案允许更多格式。
          • 还有 dd/mm/yyyy 和 mm/dd/yyyy 之间的问题
          猜你喜欢
          • 1970-01-01
          • 2017-04-04
          • 2010-11-22
          • 1970-01-01
          • 2016-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多