How to determine if value is a date in PHP

后端 未结 3 1340
不思量自难忘°
不思量自难忘° 2021-02-13 21:34

I am working with arrays of values in PHP. Some of these values may include a date in various string formats.

I need to convert dates in multiple formats to their numeri

相关标签:
3条回答
  • 2021-02-13 22:02

    In short, is there an easy way to check if a string value is a date?

    Not really, seeing as it could be in an arbitrary format.

    If at all possible, I would tend to leave parsing to the magic of strtotime(). If it manages to create a valid date, fine. If it doesn't, you'll receive false.

    Be prepared for the possibility of false positives, though, because strtotime() parses even things like "Last Friday".

    If strtotime() is too liberal for you, you could consider building a collection of date formats you want to accept, and run PHP 5.3's DateTime:createFromFormat using every one of the formats on every date.

    Something like (untested)

    $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>";
        }
     }
    
    0 讨论(0)
  • 2021-02-13 22:02

    The problem with Pekka's script is that the date '2011-30-30' is also considered valid. This is the modified version.

    $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>";
        }
     }
    
    0 讨论(0)
  • 2021-02-13 22:03

    Extrapolating from http://au1.php.net/checkdate#113205 ; just change the $formats array to all the formats you want to check.

    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;
    
    }
    
    0 讨论(0)
提交回复
热议问题