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

时间:2010-11-19 14:48:09

标签: php datetime

我正在使用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 个答案:

答案 0 :(得分:20)

  

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

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

如果可能的话,我倾向于将解析留给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>";
    }
 }

答案 1 :(得分:13)

Pekka脚本的问题是'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>";
    }
 }

答案 2 :(得分:1)

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;

}