Determinar correctamente si la cadena de fecha es una fecha válida en ese formato

Resuelto Marty Wallace asked hace 54 años • 21 respuestas

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-01y saber si es una fecha válida o no para el formato yyyy-mm-dd?

Marty Wallace avatar Jan 01 '70 08:01 Marty Wallace
Aceptado

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!

Amal Murali avatar Oct 09 '2013 11:10 Amal Murali

Determinar si alguna cadena es una fecha.

function checkIsAValidDate($myDateString){
    return (bool)strtotime($myDateString);
}
arsh avatar Jun 25 '2014 06:06 arsh

Ú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
vineet avatar Mar 17 '2015 07:03 vineet