Zonas horarias con PHP

Escrito en PHP, Tutoriales

Hace un par de años publicamos un artículo titulado Zonas horarias y PHP en el que explicábamos los entresijos del sistema que habíamos empleado para la programación de los sorteos que se realicen fuera de España.

En ese artículo se narra un mecanismo que proporciona el lenguaje de PHP para realizar los cambios de horario de forma eficaz y abarcando todas las opciones posibles. Sin embargo recientemente tuvimos que revisar todo el sistema porque había muchas quejas de usuarios que tenían problemas con sus sorteos programados que se realizaban a horas diferentes a las que ellos habían definido.

Al analizar la situación más en detalle pudimos ver que hay bastantes problemas en el sistema que indicamos en el artículo «Zonas horarias y PHP» que no tienen fácil solución.

Por un lado está el problema de que todo el empaquetado de zonas horarias y fechas de cambio está dentro de la instalación de PHP. Si un gobierno decide cambiar esa fecha, como ha sucedido recientemente con Argentina, la información de cambio está obsoleta y es sencillamente equivocada. PHP soluciona el problema creando una modificación a sus programas pero esa modificación se incluye en la versión más moderna de todas.

Ahora bien, uno no puede actualizarse la versión de PHP cada día. Sobre todo si se tiene la página en un hosting compartido, la actualización de versión la dictan los proveedores del servicio, uno no puede realizar dicho cambio. En nuestro caso, tenemos que vivir con una versión desfasada que tiene errores en las conversiones de hora para sorteos de Argentina y hemos tenido que implementar soluciones alternativas un poco artificiales. Oficialmente con la versión de PHP instalada, cuando queremos saber la hora actual de Buenos Aires no da una que está equivocada en dos horas.

Hace unas semanas se produjo el cambio de hora y también pudimos ver cómo horas antes de dicho cambio cuando se consultaba la hora estándar del sistema (mediante time(), tras establecer la zona horaria), la UTC (antigua de Greenwich) el sistema estaba dando un dato erróneo en una hora.

En conclusión, dar una actualización a la opinión que expresábamos hace dos años. No se puede establecer un sistema de cambios horarios que sea eficaz al 100% mediante PHP. La única opción es actualizar las versiones casi de continuo o crear un sistema artesanal donde ir indicando las diferencias horarias. El problema no es exclusivo de PHP y la culpa no es de ellos sino de muchos gobiernos que arbitrariamente modifican los políticas sobre diferencias horarias, no se ciñen a lo previsto años antes sino que realizan muchos cambios con efecto inmediato. En algunos casos también hay medidas de tipo político, como algunas regiones que pretenden distinguirse del resto del país con un cambio de zona horaria. Estos cambios no se reflejan automáticamente en las funciones de PHP.


Escrito por .

Escribe un comentario:



2 comentarios for “Zonas horarias con PHP”

  1. Nucleorion dice:

    Me voy a suicidar. Ha sido un honor escribir codigo con vosotros. Me despido de este mundo esperando que en el infierno no haya horarios de verano e invierno, ni siquiera zonas horarias.

    Me suicido informaticamente hablando eh? Un saludo y enhorawena por la web.

  2. David Solé dice:

    Buenas!

    Tengo un problema similar, y a día de hoy hay una solución «más o menos» decente:

    http://pecl.php.net/package/timezonedb

    Aquí hay una extensión (aún no la he descargado, parece una base de datos) con las transiciones actualizadas.

    Aparte, si usáis PHP 5.3, el tema de las transiciones se soluciona con:

    $t = new DateTimeZone(‘Europe/Madrid’);
    $tt = $t->getTransitions(time(), time());
    /*ahora en $tt tenemos la transición «adecuada» al tiempo pasado (el primer parámetro es el tiempo mínimo, el segundo el tiempo máximo; con esto obtienes un array de todas las transiciones entre el primer parámetro y el segundo).*/

    Si todavía no lo usáis, espero que os sirva!