formatos - Compruebe si la variable es una fecha válida con PHP
formatos de fecha en php (3)
Estoy trabajando en un script 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.
He visto varias formas de verificar si una picadura es una fecha, pero la mayoría de ellas requieren que se haga el formato. No sabré el formato que tendrá la fecha en.
En este momento estoy usando strtotime (), pero esto falla fácilmente
$field ="May";
if(strtotime($field)){
echo "This is a date";
}
En este caso, "mayo" fue el nombre de la persona, y no una fecha en absoluto.
¿Alguien puede recomendar una función más confiable?
Edición basada en 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 "mayo" sería demasiado vago para contar.
Sobre la base de eso y del buen punto de Pauls a continuación, también podemos probar 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 ¿alguien puede detectar algún problema o sugerir mejoras?
No creo que haya una respuesta integral a este problema. Puede tener diferentes estrategias dependiendo de su caso de uso.
Su strtotime()
es una solución perfecta, pero como dice, puede terminar con un falso positivo. ¿Por qué? Porque 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
Por lo tanto, al dar solo el mes se devolverá una fecha del año en curso y el día en curso a partir de la medianoche con el mes dado. Una posible solución sería verificar si su cadena incluye el día actual y / o el año actual, de esta manera, puede verificar para asegurarse de que su fecha sea una fecha totalmente calificada 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 solo debe usarse 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
);
Debe tratar de cubrir la mayor parte del caso y estoy seguro de que podrá encontrar expresiones regulares que comprueben el formato de fecha más reciente.
En cualquier caso, es posible que deba adaptar su función de vez en cuando, ya que no existe una manera fácil de hacerlo a prueba de balas.
Sé que esto se solicitó hace mucho tiempo, pero buscando esto y tratando de evitar la expresión regular, se me ocurrió esto:
function checkInputIsDate($date) {
return (bool)strpbrk($date,1234567890) && strtotime($date);
}
Esto funciona porque elimina los problemas publicados anteriormente, en los que solo se pasa un mes a strtotime
asegurándose de que haya números en la cadena con strpbrk
, así como la verificación de la fecha de strtotime
.
Y aprendí sobre una función que no sabía que existía.
Espero que esto ayude a alguien.
Use date_parse y verifique los valores de la matriz devuelta
$date = date_parse("May")
// ["year"] == FALSE
// ["month"] == 5
// ["day"] == FALSE
También puede pasar esos en checkdate .
$date = date_parse($someString);
if ($date["error_count"] == 0 && checkdate($date["month"], $date["day"], $date["year"]))
echo "Valid date";
else
echo "Invalid date";