2012-05-21 12 views
39

Estoy trabajando en una secuencia de comandos que importará algunos datos de un archivo CSV. Mientras hago esto, quiero poder verificar una variable para ver si es una cadena de fecha válida.Comprueba si la variable es una fecha válida con PHP

He visto varias maneras de comprobar si una picadura es una fecha, pero la mayoría de ellas requieren que usted ahora el formato. No voy a conocer el formato que la fecha será en.

en este momento estoy usando strtotime(), pero esto no logra fácilmente

$field ="May"; 
if(strtotime($field)){ 
    echo "This is a date"; 
} 

En este caso, "Mayo" fue el personas primer nombre, y no una fecha en absoluto.

¿Alguien puede recomendar una función más confiable?

Editar según las preguntas de algunos de ustedes.

Para que una variable pase como una "fecha" en mi caso, tendría que ser específica para un día/mes/año, por lo que solo "May" sería vago para contar.

Basado en eso y Pauls buen punto por debajo también podemos probar para ver si la cadena contiene un número, como

$field ="May"; 
if(strtotime($field) && 1 === preg_match('~[0-9]~', $field)){ 
    echo "This is a date"; 
}else{ 
    echo "Nope not a date"; 
} 

Esto parece cubrir mis necesidades inmediatas, pero puede alguien punto de cualquier problema o sugerir mejoras?

+0

¿Cómo indica el script si 'May' era un nombre o una fecha? – lonesomeday

+2

Debe dar * algunas * especificaciones que tipo de valores acepta. De lo contrario, "mayo" es tan bueno como cualquier otro valor. – JJJ

+0

Comprueba si la persona tiene un apellido – Joelmob

Respuesta

5

No creo que haya una respuesta "todo en uno" para este problema. Puede tener una estrategia diferente según su caso de uso.

Su strtotime() es una solución perfecta, pero como usted dice, puede terminar con un falso positivo. ¿Por qué? Porque puede puede ser una palabra o un nombre. Sin embargo, ¿cuál es el resultado de strtotime('May')?

echo date(DateTime::ISO8601, strtotime('May')); 
2012-05-21T00:00:00+0200 

Así dando sólo el mes devolverá una fecha del año en curso y el día actual a partir de la medianoche con el mes dado. Una posible solución sería verificar si su cadena tiene el día actual y/o el año actual incluido, de esta manera, puede verificar para asegurarse de que su fecha sea válida y válida.

echo date(DateTime::ISO8601, strtotime('May Day')); // (strtotime() returns false) 
1970-01-01T01:00:00+0100 

echo date(DateTime::ISO8601, strtotime('May 21')); 
2012-05-21T00:00:00+0200 

Un simple strpos() o incluso una expresión regular debe hacer el truco.

Sin embargo, es un poco extraño y debe usarse solo si no tiene otra forma de hacerlo.

Creo que una mejor solución sería definir un conjunto de formato válido e interpolar el resultado para asegurarse de que la fecha sea válida.

$validDateFormatPatterns = array(
'[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}', // 21-05-2012, obviously this pattern is simple and would accept 05-21-2012, 
'the [0-9]{1,2}(th|st|nd|rd) (January|February|...|May|...|December) [0,9]{4}', // The 21st May 2012 
); 

Usted debe tratar de cubrir la mayor parte del caso y estoy seguro de que será capaz de encontrar expresiones regulares que comprueba durante la mayor formato de fecha actual.

En cualquier caso, puede que tenga que adaptar su función de vez en cuando porque no hay una manera fácil de hacerlo a prueba de balas.

56

Uso date_parse y comprobar los valores de la matriz devuelta

$date = date_parse("May") 

// ["year"] == FALSE 
// ["month"] == 5 
// ["day"] == FALSE 

También se puede pasar en los checkdate.

$date = date_parse($someString); 
if ($date["error_count"] == 0 && checkdate($date["month"], $date["day"], $date["year"])) 
    echo "Valid date"; 
else 
    echo "Invalid date"; 
+0

Creo que lo tienes ... ¿Alguien puede ver algún defecto con esto? – Alex

+0

Un pequeño error: 'date_parse' usa las reglas de análisis' strtotime', que son [bien definidas pero meticulosas] (http://www.php.net/manual/en/datetime.formats.php). Es posible enviar datos que devuelvan una fecha legal pero no es lo que se pretendía. – Charles

+2

@Charles sin requerir un formato de entrada bien definido, cualquier algoritmo para analizar una fecha automáticamente tendrá problemas – saluce

0

Sé que esto se le preguntó hace mucho tiempo, pero mirando a su alrededor para esto y tratando de evitar expresiones regulares, se me ocurrió esto:

function checkInputIsDate($date) { 
    return (bool)strpbrk($date,1234567890) && strtotime($date); 
} 

Esto funciona porque le quita los temas publicados arriba, donde solo pasa un mes en strtotime asegurándose de que haya números en la cadena con strpbrk, así como la verificación de strtotime muestra una fecha.

Y aprendí sobre una función que no sabía que existía.

Espero que esto ayude a alguien.

Cuestiones relacionadas