Mi patrón no coincide con una fecha de estilo ISO, ¿por qué? [duplicar]

Resuelto marius2k12 asked hace 54 años • 3 respuestas
function validateDate( $date )
{ 
    echo $date;
    //2012-08-24 20:30:00
    if(preg_match('/^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([1-2]{1})([0-9]{1}):([0-5]{1})([0-9]{1}):([0-5]{1})([0-9]{1})$/', $date) >= 1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

Esto siempre devuelve falso. Utilicé una única herramienta para crear la expresión regular y funcionó bien allí. El problema comenzó cuando agregué "/" a la expresión regular. De alguna manera PHP parece requerirlos, pero no sé por qué y no sé por qué rompe mi expresión regular.

Debería devolver VERDADERO para algo. como "2012-08-24 20:30:00" y FALSO para "asdf2012-08-24 20:30:00asdf" o cualquier cosa que no esté de acuerdo con mi expresión regular

Como señalaron algunos usuarios, mi función devuelve verdadero para la fecha de muestra "2012-08-24 20:30:00". Sin embargo, lo hace solo si configuro manualmente $date='2012-08-24 20:30:00'. Si llamo a la función en otra parte de mi código con exactamente la misma cadena, devuelve falso. ¿Alguien sabe por qué?

marius2k12 avatar Jan 01 '70 08:01 marius2k12
Aceptado

¿Por qué utilizar expresiones regulares? Utilice la clase DateTime .

function validateDate($date, $format = 'Y-m-d H:i:s')
{
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) == $date;
}

Puede utilizar esta función para todo tipo de validaciones de fecha/hora. Ejemplos:

var_dump(validateDate('2012-02-28 12:12:12')); # true
var_dump(validateDate('2012-02-30 12:12:12')); # false
var_dump(validateDate('2012-02-28', 'Y-m-d')); # true
var_dump(validateDate('28/02/2012', 'd/m/Y')); # true
var_dump(validateDate('30/02/2012', 'd/m/Y')); # false
var_dump(validateDate('14:50', 'H:i')); # true
var_dump(validateDate('14:77', 'H:i')); # false
var_dump(validateDate(14, 'H')); # true
var_dump(validateDate('14', 'H')); # true

var_dump(validateDate('2012-02-28T12:12:12+02:00', 'Y-m-d\TH:i:sP')); # true
# or
var_dump(validateDate('2012-02-28T12:12:12+02:00', DateTime::ATOM)); # true

var_dump(validateDate('Tue, 28 Feb 2012 12:12:12 +0200', 'D, d M Y H:i:s O')); # true
# or
var_dump(validateDate('Tue, 28 Feb 2012 12:12:12 +0200', DateTime::RSS)); # true
var_dump(validateDate('Tue, 27 Feb 2012 12:12:12 +0200', DateTime::RSS)); # false
# ...
Glavić avatar Sep 07 '2012 17:09 Glavić

Devuelve truepor mí. Pruebe esta expresión regular en su lugar:

function validateDate($date) {
  echo $date;
  if( !preg_match("/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/",$date,$m)) return false;
  if( !checkdate($m[1],$m[2],$m[0])) return false;
  if( $m[3] > 23) return false;
  if( $m[4] > 59) return false;
  if( $m[5] > 59) return false;
  return true;
}

Es más fácil validar el formato en RegEx, seguido de validar el contenido con funciones específicas, que intentar hacer todo en RegEx.

Niet the Dark Absol avatar Sep 07 '2012 17:09 Niet the Dark Absol