Nov
25Una hora perdida
Filed Under (Trabajo) by admin on 25-11-2009
Tagged Under : PHP, strtotime, Tiempo, Zona Horaria
Mientras estaba haciendo un pequeño calendario que mostrara fechas con ligas a otras parte del sitio, pensé que la manera más fácil era evitar llamar a strototime:
strtotime("+1 days", $time)
y en su lugar utilizar directamente la suma de 86,400 segundos que es un dÃa:
60 * 60 segundos = 3600 segundos (1 hora) * 24 = 86400
El calendario no tenÃa ningún problema hasta que noté que tenÃa repetido dos veces el dÃa 1º de noviembre, los tiempos eran los siguientes (tiempo Unix):
1257051600: 2009-11-01 00:00:00 1257138000: 2009-11-01 23:00:00
Si hacen la suma, observarán que se sumó 86,400 segundos a una fecha y otra; pero el tiempo regresado por PHP (de hecho por el sistema Linux) es de 23 horas y no 24 horas.
Hice algunas pruebas en otros servidores y solo uno imprimió la fecha que esperaba (2009-11-02 00:00:00), la primera idea (por el cansancio) fue que era un error de PHP/Linux. Buscando un posible error, encontré algunas preguntas que como yo habÃan tenido un problema similar, pero mencionaban algo de la zona horaria, eso me recordó que el 1º de Noviembre en México atrasamos el reloj una hora por lo que en realidad el cálculo era correcto desde la perspectiva de Linux ya que estaba olvidando esa “hora perdida” en mis cálculos, el servidor que regresó bien la fecha estaba en otra zona horaria por lo que no compartÃan nuestro cambio de horario.
El tiempo Unix correcto es: 1257141600 no es otra cosa que es el dÃa (86400) más la hora “perdida” (3600), este tiempo lo obtuve llamando a strtotime en PHP en lugar de calcularlo por mi cuenta.
Moraleja: Manipular el tiempo Unix de forma directa agregando valores puede ser muy rápido y simplifica la implementación, pero si quieres hacer algo que no tenga errores utiliza siempre las funciones de tiempo de PHP/Linux.