Tiempo estimado de lectura:

El problema más habitual es que MySQL, recién instalado, no venga equipado con la información de los distintos husos horarios. También puede ocurrir que aún no hayas instalado la librería pytz, que es la que utiliza Django para manejar las zonas horarias.

Por tanto, lo primero que deberías hacer es comprobar que tienes instalada la librería de marras. Para ello, abre un terminal de Django:

$ ./manage.py shell

Escribe lo siguiente y pulsa la tecla ENTER:

import pytz

Si no ocurre nada entonces la librería está instalada. En cambio, si aparece un mensaje de error, lo que tienes que hacer es instalarla con la utilidad pip.

$ pip install pytz

Asumo que utilizas virtualenv, que es la mejor forma de crear espacios de librerías de código independientes en Python para que cada aplicación tenga sus propias versiones de las librerías que necesite para funcionar.

Si tras instalar pytz sigue apareciendo el mensaje de error, tienes que cargar los datos de zonas horarias en MySQL.

MySQL suele traer un programita que, a partir de unos ficheros de información de husos horarios, genera un fichero SQL con los datos a cargar en base de datos.

En Mac OS X (y en UNIX en general, imagino), el programa en cuestión se llama mysql_tzinfo_to_sql, y la información de husos horarios se encuentra en /usr/share/zoneinfo. El comando de terminal:

$ mysql_tzinfo_to_sql /usr/share/zoneinfo

generará un script en lenguaje SQL que aparecerá en pantalla. Mediante una tubería de shell podemos redirigir ese script e inyectarlo directamente en MySQL:

$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

Este comando os pedirá vuestra contraseña de superadministrador en MySQL.

Una vez termine de ejecutarse, debería funcionar todo correctamente. También puedes asegurarte de que MySQL trabaja por defecto en UTC si así lo configuras en el fichero my.cnf de tu instalación de MySQL.

¿Por qué utilizar UTC?

Por si no sabes lo importante que es guardar los valores temporales como UTC, yo te lo cuento rápidamente.

En el momento en que yo escribo esto, son aproximadamente las 21:00 en mi zona horaria, que es UTC+2 por estar utilizando ya el horario de verano. Es decir, serían las 19:00 en zona horaria UTC. Si yo guardo en base de datos el valor UTC, la conversión horaria es más fácil de hacer si quiero mostrar el valor de tiempo a mis visitantes de Japón, ya que convertir desde UTC es más fácil que convertir de UTC+2. Por tanto, para un japonés (UTC+9) yo estaría escribiendo esto aproximadamente a las 4 de la madrugada… ¡del día siguiente!

Si en tu base de datos solamente escribes tú, y siempre lo haces desde la misma parte del mundo, a lo mejor no tiene importancia, pero si tu aplicación web la utilizan personas de todo el mundo, guardar las fechas en UTC te ahorrará más de un dolor de cabeza y te proporcionará una flexibilidad impresionante.

Estás a un paso de inventar la máquina del tiempo. Y lo sabes.

Blog Logo

Carlos Escribano

Desarrollador Web desde hace 10 años. Me gusta resolver problemas de forma ingeniosa. Saber más.

Artículos de desarrollo web en español

nettoys.es

Volver al Inicio