Determinar correctamente si la cadena de fecha es una fecha válida en ese formato
Recibo una cadena de fecha de una API y tiene el formato yyyy-mm-dd
.
Actualmente estoy usando una expresión regular para validar el formato de cadena, que funciona bien, pero puedo ver algunos casos en los que podría ser un formato correcto según la cadena pero en realidad una fecha no válida. es decir 2013-13-01
, por ejemplo.
¿Existe una mejor manera en PHP de tomar una cadena como 2013-13-01
y saber si es una fecha válida o no para el formato yyyy-mm-dd
?
Puedes utilizar DateTime::createFromFormat()
para este propósito:
function validateDate($date, $format = 'Y-m-d')
{
$d = DateTime::createFromFormat($format, $date);
// The Y ( 4 digits year ) returns TRUE for any integer with any number of digits so changing the comparison from == to === fixes the issue.
return $d && $d->format($format) === $date;
}
[ Función tomada de esta respuesta . También en php.net . Escrito originalmente por Glavić . ]
Casos de prueba:
var_dump(validateDate('2013-13-01')); // false
var_dump(validateDate('20132-13-01')); // false
var_dump(validateDate('2013-11-32')); // false
var_dump(validateDate('2012-2-25')); // false
var_dump(validateDate('2013-12-01')); // true
var_dump(validateDate('1970-12-01')); // true
var_dump(validateDate('2012-02-29')); // true
var_dump(validateDate('2012', 'Y')); // true
var_dump(validateDate('12012', 'Y')); // false
¡Manifestación!
Determinar si alguna cadena es una fecha.
function checkIsAValidDate($myDateString){
return (bool)strtotime($myDateString);
}
Úselo de manera sencilla con la función prediseñada de PHP:
function checkmydate($date) {
$tempDate = explode('-', $date);
// checkdate(month, day, year)
return checkdate($tempDate[1], $tempDate[2], $tempDate[0]);
}
Prueba
checkmydate('2015-12-01'); //true
checkmydate('2015-14-04'); //false