2010-11-19 12 views
10

Estoy trabajando con matrices de valores en PHP. Algunos de estos valores pueden incluir una fecha en varios formatos de cadena.Cómo determinar si el valor es una fecha en PHP

Necesito convertir las fechas en múltiples formatos a su equivalente numérico (marca de tiempo Unix). El problema es poder determinar si la cadena es una fecha.

Usando

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

va a comprobar si hay una fecha válida de una cadena pero ¿cómo puedo determinar si el valor aún debe ser validado como una fecha?

Ejemplo:

$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)) ? 

... 

} 

En pocas palabras, ¿hay una manera fácil de comprobar si un valor de cadena es una fecha?

+1

¿Qué es esto: '$ x = {/ * ... * /};'? – jwueller

+0

Esa es mi matriz de código de sudo :-) –

Respuesta

20

En resumen, ¿hay una manera fácil de comprobar si el valor de una cadena es una fecha?

En realidad no, ya que podría ser en un formato arbitrario.

Si es posible, me gustaría dejar de analizar la magia de strtotime(). Si logra crear una fecha válida, bien. Si no lo hace, recibirá false.

Prepárese para la posibilidad de falsos positivos, sin embargo, porque strtotime() analiza incluso cosas como "El viernes pasado".

Si strtotime() es demasiado liberal para usted, podría considerar crear una colección de formatos de fecha que desea aceptar, y ejecutar PHP 5.3 DateTime:createFromFormat utilizando cada uno de los formatos en cada fecha.

Algo así (no probado)

$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

No pensé que hubiera una forma rápida de hacerlo. Sin embargo, tu solución funciona bien. Gracias. –

+3

Parece que es posible hacerlo rápida y elegantemente: http://au1.php.net/checkdate#113205 – CMCDragonkai

13

El problema con el guión de Pekka es que la fecha '2011-30-30' también se considera válida. Esta es la versión modificada.

$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>"; 
    } 
} 
1

Extrapolando a partir de http://au1.php.net/checkdate#113205; simplemente cambie la matriz de $ formatos a todos los formatos que quiera verificar.

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; 

} 
Cuestiones relacionadas