2011-07-06 20 views
8

Actualmente estoy trabajando con Doctrine 2 y MySQL. Me encuentro con algunos problemas cuando trabajo con campos de fecha y hora en mysql respectivamente DateTime en PHP. Cuando en mi base de datos el valor de la fecha es "0000-00-00", en PHP este valor se convierte en -0001-11-30. Estoy muy contento por eso, así que necesito verificar el valor de la fecha de "0000-00-00". ¿Alguien tiene alguna idea sobre esto para ayudar? Gracias.Cómo evitar que PHP convierta un objeto DateTime con el valor 0000-00-00 en -0001-11-30

N.B. Estoy pensando si es correcto verificar "-0001-11-30" en lugar de "0000-00-00".

+1

@domanokz - que sería un paso en la * mal * dirección –

+0

Sí, me olvidaba, las variables en PHP cambia su DataType según su contenido. – dpp

Respuesta

7

Si la fecha no está configurada, use NULL para indicar ese estado. Eso resuelve su problema y hace que el esquema de la base de datos sea mucho más claro y prolijo.

-4

Si usted no puede manejar esto en su base de datos, puede utilizar este fragmento para evitar este comportamiento Anda validar la fecha de

$date = new DateTime('0000-00-00 00:00'); 
if (DateTime::createFromFormat('Y-m-d', $date->format('Y-m-d'))) { 
    // Valid 
} else { 
    // Not valid 
} 
0

utilizo este funcionar a través de mi código. Páselo una cadena tipo fecha o un objeto DateTime (Inmutable); escupirá un objeto PHP DateTime o DateTimeImmutable, o false si input es un string "0000-00-00". Con el segundo parámetro también puede obligar a que el resultado sea inmutable o no:

function ensureDateTime ($input, $immutable = NULL) { 
    if (! $input instanceof \DateTimeInterface) { 
     if (in_array($input, ['0000-00-00', '0000-00-00 00:00:00'], true)) { 
      $input = false; 
     } elseif ($immutable) { 
      $input = new \DateTimeImmutable($input); 
     } else { 
      $input = new \DateTime($input); 
     } 
    } elseif (true === $immutable && $input instanceof \DateTime) { 
     $input = new \DateTimeImmutable($input->format(TIMESTAMPFORMAT), $input->getTimezone()); 
    } elseif (false === $immutable && $input instanceof \DateTimeImmutable) { 
     $input = new \DateTime($input->format(TIMESTAMPFORMAT), $input->getTimezone()); 
    } 
    return $input; 
} 

Básicamente un "No estoy seguro de lo que empecé con, pero sé lo que quiero", la función.

(Nota: Un poco de sintaxis de PHP 7 aquí, pero fácilmente adaptada a PHP 5)

Cuestiones relacionadas