viernes, 7 de marzo de 2008

¿Cómo corrijo la zona horaria?

En vista del retraso de este año en el cambio de la zona horaria para Chile intentaré describir el manejo de la hora en los sistemas computacionales y dar algunas luces de cómo es el procedimiento adecuado para actualizar el cambio de hora. He omitido algunos conceptos y generalizado en algunos aspectos con el fin de no hacer tan compleja la explicación.

Si no han vivido en una caverna durante toda su vida, debieran saber que el planeta tierra se divide en 24 husos horarios donde cada uno posee una diferencia de una hora con respecto al contiguo. Por efectos prácticos cada país hace coincidir el huso horario con sus limites geográficos y utiliza el término de zona horaria.

Todos los husos horarios o zonas horarias se definen en función del Tiempo universal coordinado (UTC) el cual está fijado en el meridiano de Greenwich (GMT-0), de esta manera nuestro país normalmente está en GMT-4.

Ahora bien, cada país realiza algunos ajustes en su horario, por ejemplo Chile en la época estival utiliza el horario de verano el cual nos mueve desde GMT-4 a GMT-3. Debido a que es complejo saber todas las reglas de cada país, se definen nuevas zonas horarias que para el caso de Chile son America/Santiago en el territorio continental y Pacific/Easter para la isla de Pascua.

Como vivimos en un mundo globalizado, podríamos asumir que la "hora oficial del mundo" es la correspondiente a GMT-0 (simplemente GMT o UTC), de hecho nuestros computadores almacenan todas las fecha en GMT.

Por ejemplo, (aquí en Chile: America/Santiago) si tengo que agendar una reunión el 10 de enero (que corresponde al horario de verano), al registrar la fecha "10 de enero de 2008 15:00:00" mi software de agenda -antes de guardarla en su base de datos- la convertirá a hora "universal" (o GMT) por lo que le sumará 3 horas quedando guardada como "10 de enero de 2008 18:00:00". Luego, cada vez que mi agenda me muestre la fecha, leerá la fecha en GMT, la modificará según mi zona horaria y luego de eso me la mostrará.


Compliquemos las cosas...
Lo estándar es que el término del horario de verano (regresar de GMT-4 a GMT-3) fuese el segundo sábado de marzo (al final del día), pero para este año 2008 el cambio se realizará el sábado 29 de marzo.

Para los usuarios domésticos, tener algunas fechas equivocadas puede ser aceptable, pero en sistemas corporativos eso puede ser muy peligroso.

Alternativa N°0: Sincronizar con un servidor ntp (servidor de hora)
Un servidor de hora permite que nuestro equipo tenga la hora actualizada, pero estos servicios conversan en UTC y luego el equipo local ajusta la hora local en base a la zona horaria, por lo tanto no sirve para el problema del cambio de hora. De todos modos es una buena práctica tener nuestro equipo sincronizado con ntp.shoa.cl.



Alternativa N°1: Adelantar la hora
La solución más sencilla que a uno se le ocurre es que -luego de que suceda el cambio de hora- adelantemos el reloj del sistema y luego el 29 de marzo volver a retrasarlo. Este cambio haría que todas las fechas almacenadas entre el 9 y 29 de marzo queden guardadas erróneamente ya que en vez de considerarlas como GMT-4 (horario de verano) las tomará como GMT-3.

Repitamos el ejemplo inicial: Si agendo una reunión para el día 12 de marzo a las 10:00 (hora local America/Santiago), el sistema -al convertirla a UTC- le aplicará la corrección GMT-3 (le sumará 3 horas) convirtiéndola erróneamente en "12 de marzo de 2008 13:00:00" cuando lo correcto es sumarle 4 horas y almacenarla como "12 de marzo de 2008 14:00:00".

Si envío la cita a los demás asistentes, ellos podrían recibir la cita con una hora de anticipación pudiendo pasar más de un mal rato. Mientras nuestro software (o sistema operativo) no actualice las reglas de la zona horaria de America/Santiago este error pasará desapercibido en mi computador porque tanto al guardar la fecha como al leerla utilizará la misma zona horaria GMT-3. Cuando a futuro haga una actualización de mi software (o sistema operativo) es posible que se haya incluido la actualización de la zona horaria y ahí quedaría en evidencia el error haciendo que todas las fechas ingresadas durante esas 3 semanas estén adelantadas en una hora.


Alternativa N°2: Cambiar la zona horaria a GMT-4
Otra alternativa es cambiar la zona horaria manualmente a GMT-4 (cuya zona horaria es ETC/GMT+4, el signo "+" es correcto) para forzar el uso del horario de verano y luego el 29 de marzo volver a America/Santiago. Esto hará que las fechas se almacenen correctamente ya que no habremos cambiado la hora de nuestro computador, pero tiene el inconveniente que asumirá que todas las fechas están en GMT-4 por lo que al consultar una fecha del horario de invierno (por ejemplo "18 de septiembre de 2007 10:00:00"), en vez de restarle 3 horas a la fecha GMT que está almacenada en el sistema, le restará 4.



Alternativa N°3: Actualizar la "definición" de la zona horaria
La solución correcta es actualizar la definición de la zona horaria, es decir, que el sistema sepa que en 2008 el término del horario de verano para America/Santiago es el 29 de marzo y no el 9 de marzo.

El problema de esta solución es que no es fácil realizar el cambio, ya que usualmente consiste en realizar cambios a archivos del sistema operativo o al registro de Windows.


Solución para Windows
Para servidores Windows, Microsoft publicó un comunicado donde recomienda la cambiar la zona horaria (nuestra alternativa N°2) para usuarios domésticos y la actualizar la definición de la zona horaria America/Santiago (nuestra alternativa N°3) para usuarios corporativos.


Solución para LINUX
En servidores LINUX (y en general *NIX) la información de las zonas horarias es mantenida por el paquete tzdata, sin embargo a la fecha de escritura de este artículo, dicho paquete aún no contiene la actualización a nuestra zona America/Santiago, por lo tanto la solución es regenerar la definición del archivo de zona. A continuación describo el procedimiento para distribuciones RedHat, Fedora y CentOS. En otras distribuciones es posible que los comandos y ubicación de los archivos sea distinta.

Al momento de escribir este artículo UBUNTU ya cuenta con una actualización del paquete tzdata: https://bugs.launchpad.net/ubuntu/+source/tzdata/+bug/198129.

Si bien hay muchos servicios que utilizan el sistema operativo para el manejo de la zona horaria, hay software que mantiene su propio módulo de zonas horarias por lo que ignorará estos cambios, por ejemplo (algunas versiones de): PHP 5.1+, ORACLE y JAVA.

Actualizado: Ya se publicó la actulización oficial de tzdata 2008a por lo que ahora -si lo prefieres- en vez de crear el archivo tzdata.txt que indico más abajo, puedes descargar el archivo oficial y luego importar el archivo southamerica como indico a continuación:
cd /tmp
wget ftp://elsie.nci.nih.gov/pub/tzdata2008a.tar.gz
tar xfz tzdata2008a.tar.gz
zic southamerica
En caso que prefieras no descargar el archivo anterior, se debe crear el archivo newzone.txt con el siguiente contenido:

Rule Chile 1927 1932 - Sep 1 0:00 1:00 S
Rule Chile 1928 1932 - Apr 1 0:00 0 -
Rule Chile 1942 only - Jun 1 4:00u 0 -
Rule Chile 1942 only - Aug 1 5:00u 1:00 S
Rule Chile 1946 only - Jul 15 4:00u 1:00 S
Rule Chile 1946 only - Sep 1 3:00u 0:00 -
Rule Chile 1947 only - Apr 1 4:00u 0 -
Rule Chile 1968 only - Nov 3 4:00u 1:00 S
Rule Chile 1969 only - Mar 30 3:00u 0 -
Rule Chile 1969 only - Nov 23 4:00u 1:00 S
Rule Chile 1970 only - Mar 29 3:00u 0 -
Rule Chile 1971 only - Mar 14 3:00u 0 -
Rule Chile 1970 1972 - Oct Sun>=9 4:00u 1:00 S
Rule Chile 1972 1986 - Mar Sun>=9 3:00u 0 -
Rule Chile 1973 only - Sep 30 4:00u 1:00 S
Rule Chile 1974 1987 - Oct Sun>=9 4:00u 1:00 S
Rule Chile 1987 only - Apr 12 3:00u 0 -
Rule Chile 1988 1989 - Mar Sun>=9 3:00u 0 -
Rule Chile 1988 only - Oct Sun>=1 4:00u 1:00 S
Rule Chile 1989 only - Oct Sun>=9 4:00u 1:00 S
Rule Chile 1990 only - Mar 18 3:00u 0 -
Rule Chile 1990 only - Sep 16 4:00u 1:00 S
Rule Chile 1991 1996 - Mar Sun>=9 3:00u 0 -
Rule Chile 1991 1997 - Oct Sun>=9 4:00u 1:00 S
Rule Chile 1997 only - Mar 30 3:00u 0 -
Rule Chile 1998 only - Mar Sun>=9 3:00u 0 -
Rule Chile 1998 only - Sep 27 4:00u 1:00 S
Rule Chile 1999 only - Apr 4 3:00u 0 -
Rule Chile 2000 2007 - Mar Sun>=9 3:00u 0 -
Rule Chile 2008 only - Mar 30 3:00u 0 -
Rule Chile 1999 max - Oct Sun>=9 4:00u 1:00 S
Rule Chile 2009 max - Mar Sun>=9 3:00u 0 -
Zone America/Santiago -4:42:46 - LMT 1890
-4:42:46 - SMT 1910
-5:00 - CLT 1916 Jul 1
-4:42:46 - SMT 1918 Sep 1
-4:00 - CLT 1919 Jul 1
-4:42:46 - SMT 1927 Sep 1
-5:00 Chile CL%sT 1947 May 22
-4:00 Chile CL%sT
Zone Pacific/Easter -7:17:44 - LMT 1890
-7:17:28 - EMT 1932 Sep
-7:00 Chile EAS%sT 1982 Mar 13 21:00
-6:00 Chile EAS%sT
Link America/Santiago Chile/Continental
Link Pacific/Easter Chile/EasterIsland

se debe ejecutar como usuario "root" el comando:
zic  newzone.txt
luego, para verificar que haya quedado bien configurado, se debe ejecutar:
zdump -v America/Santiago | grep 2008
y verificar que en dos de las reglas de cambio de horario indique 30 de marzo (Sun Mar 30). En mi LINUX la salida de este comando es:
America/Santiago  Sun Mar 30 02:59:59 2008 UTC = Sat Mar 29 23:59:59 2008 CLST isdst=1 gmtoff=-10800
America/Santiago Sun Mar 30 03:00:00 2008 UTC = Sat Mar 29 23:00:00 2008 CLT isdst=0 gmtoff=-14400
America/Santiago Sun Oct 12 03:59:59 2008 UTC = Sat Oct 11 23:59:59 2008 CLT isdst=0 gmtoff=-14400
America/Santiago Sun Oct 12 04:00:00 2008 UTC = Sun Oct 12 01:00:00 2008 CLST isdst=1 gmtoff=-10800
Luego hay que ejecutar la herramienta para configurar la zona horaria system-config-date (puede ser por linea de comandos o en el entorno gráfico), escoger America/Santiago y luego "Aceptar".

Algunos servicios requieren ser reiniciados para reconocer los cambios, en caso de ser posible es mejor reiniciar el equipo.


PHP
Tal como comentaba más arriba, PHP desde la versión 5.1 incluye su propio módulo de zona horaria por lo que ignorará las reglas de la zona horaria del sistema operativo. En este caso se puede realizar otro procedimiento que comento aquí.



(Actualizado el domingo 9 de marzo a las 11:30)

4 comentarios:

j.gonzal dijo...

Hola. Tengo una consulta. Porque se asigna -4:47 ?

Anónimo dijo...

Hola!
Me podrás ayudar a averiguar el huso horario para mendoza el 6 de julio de 1972.

Muchas gracias!

Eugenia

Anónimo dijo...

te agradezco tu comentario! pero tengo que decirte que tus comentarios me parecieron bastante discriminatorios! no todos sabemos lo de los husos horarios!! gracias!

Anónimo dijo...

Necesito saber como se hace el cambio en un Android! Plis help!