25 julio 2015

Errores de programación: PhP y las fechas

Este error de programación me ha gustado mucho, porque es tan absurdo y desconcertante que, cuando lo descubrí, me reí mucho. Voy a presentarlo despacio porque lo merece.

Supongamos, en primer lugar, que creo una cadena de fecha de la siguiente manera:

$dia_cad=date("d-m-Y");

Esto pretende reproducir la introducción de una fecha que venga por post rellena en un formulario, ya que estoy desarrollando un "script" de prueba de una función más compleja que maneja fechas. Bien, sigo con las pruebas y utilizo esta cadena para crear un DateTime de la siguiente manera:

$dia=date_create($dia_cad);

Necesito mostrar la fecha que representa ese día en un formato que una base de datos pueda entender. Según una llamada a print_r, descubro que invocando:

$dia->date

consigo una fecha en formato "AAAA-MM-DD HH:MM:SS" lo que es perfecto. Por tanto, al ejecutar este código:

$dia_cad=date("d-m-Y");

$dia=date_create($dia_cad);

print_r($dia);

echo $dia->date;

Se muestra, por ejemplo, como resultado de la última línea "2015-07-25 11:11:11". Genial. Yo, muy contento, elimino la línea de print_r($dia) y veo que nada funciona. La línea echo $dia->date; no devuelve nada. Tras una media hora de revisar, vuelvo a invocar print_r($dia) para ver si esa variable se vacía por algún motivo raro. Y vuelve a funcionar. Y al rato lo descubro:

¡¡Si no utilizo previamente print_r, $dia->date no devuelve nada!!

La solución es sencilla. En vez de la última línea, si quiero una cadena de fecha en el formato que quiera a partir de un DateTime, invoco simplemente:

$dias->format('Y-m-d H:i:s');

Pero ¿a que ha sido un error muy divertido?