Как определить, является ли значение датой в PHP

Я работаю с массивами значений в 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)) ? ... } 

Короче говоря, есть ли простой способ проверить, является ли строковое значение датой?

Короче говоря, есть ли простой способ проверить, является ли строковое значение датой?

Не совсем, видя, что это может быть в произвольном формате.

Если это вообще возможно, я бы предпочел оставить синтаксический анализ магии strtotime() . Если ему удастся создать действительную дату, штраф. Если это не так, вы получите false .

Будьте готовы к возможности ложных срабатываний, хотя, поскольку strtotime() разбирает даже такие вещи, как «В прошлую пятницу».

Если strtotime() слишком либеральна для вас, вы можете подумать о создании коллекции форматов даты, которую вы хотите принять, и запустить DateTime:createFromFormat PHP 5.3 DateTime:createFromFormat используя каждый из форматов каждой даты.

Что-то вроде (непроверено)

 $formats = array("dmY", "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>"; } } 

Проблема с сценарием Пекки заключается в том, что дата «2011-30-30» также считается действительной. Это модифицированная версия.

 $formats = array("dmY", "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>"; } } 

Экстраполяция из http://au1.php.net/checkdate#113205 ; просто измените массив $ formats на все форматы, которые вы хотите проверить.

 public function convertDate($value) { $formats = ['M d, Y', 'Ym-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; }