代码之家  ›  专栏  ›  技术社区  ›  Todd Moses

如何确定值是否为PHP中的日期

  •  11
  • Todd Moses  · 技术社区  · 15 年前

    我正在使用PHP中的值数组。其中一些值可能包括各种字符串格式的日期。

    我需要将多种格式的日期转换为它们的数字等价物(Unix时间戳)。问题在于能否确定字符串是否为日期。

    使用

    if (($timestamp = strtotime($str)) === false)
    

    将从字符串中检查有效日期,但如何确定该值是否应作为日期进行验证?

    例子:

    $x = {1,2,3,"4","11/12/2009","22/12/2000",true,false};
    
    foreach($x as $value)
    {
    
    if(is_bool($value))
    
    if(is_string($value))
    
    if(is_numeric($value))
    
    if(is_date($value)) ?
    
    ...
    
    }
    

    简而言之,是否有一种简单的方法来检查字符串值是否是日期?

    3 回复  |  直到 10 年前
        1
  •  20
  •   RRikesh    13 年前

    简而言之,是否有一种简单的方法来检查字符串值是否是日期?

    不是真的,因为它可以是任意格式的。

    如果可能的话,我倾向于把解析留给 strtotime() . 如果它能创建一个有效的日期,那就好。否则,您将收到 false

    但是,要做好准备,因为 strtotime()。 甚至可以解析“上周五”之类的内容。

    如果 strtotime()。 对于您来说太自由了,您可以考虑构建一个要接受的日期格式集合,并运行php 5.3 DateTime:createFromFormat 在每个日期使用每个格式。

    类似(未经测试的)

    $formats = array("d.m.Y", "d/m/Y", "Ymd"); // and so on.....
    $dates = array(1,2,3,"4","11/12/2009","22/12/2000",true,false);
    
    foreach ($dates as $input) 
     { 
       foreach ($formats as $format)
        {
          echo "Applying format $format on date $input...<br>";
    
          $date = DateTime::createFromFormat($format, $input);
          if ($date == false) 
           echo "Failed<br>";
          else
           echo "Success<br>";
        }
     }
    
        2
  •  13
  •   Dave    15 年前

    佩卡剧本的问题在于,日期“2011-30-30”也被认为是有效的。这是修改后的版本。

    $formats = array("d.m.Y", "d/m/Y", "Ymd"); // and so on.....
    $dates = array(1,2,3,"4","11/12/2009","22/12/2000",true,false);
    
    foreach ($dates as $input) 
     { 
       foreach ($formats as $format)
        {
          echo "Applying format $format on date $input...<br>";
    
          $date = DateTime::createFromFormat($format, $input);
          if ($date == false || !(date_format($date,$format) == $input) ) 
           echo "Failed<br>";
          else
           echo "Success<br>";
        }
     }
    
        3
  •  1
  •   iateadonut    10 年前

    外推自 http://au1.php.net/checkdate#113205 ; 只需将$formats数组更改为要检查的所有格式。

    public function convertDate($value) {
    
        $formats = ['M d, Y', 'Y-m-d'];
        foreach($formats as $f) {
            $d = DateTime::createFromFormat($f, $value);
            $is_date = $d && $d->format($f) === $value;
    
            if ( true == $is_date ) break;
        }
    
        return $is_date;
    
    }