Python timezone. Módulo pytz

¿Qué es pytz en python?

El  módulo pytz nos permite obtener la hora en distintos países, según su huso horario.

Estaba entretenido mirando todo el tema de datetime en python y me puse a mirar todo el tema de husos horarios o timezone. Como todos sabemos, cada país tiene una hora de su padre y de su madre, según el huso o zona horaria en la que esté.

En el 99% de las aplicaciones de escritorio, sean en python o no, esto no suele dar mayores problemas. La aplicación solo corre en un ordenador y la hora es la del ordenador en el timezone que le toque.

Pero si es una web que se va a publicar en internet que se vaya a ver en varios países o es una aplicación de escritorio más compleja que se pueda instalar en clientes de varios países y que vayan contra una base de datos o servidor centralizado, pues es importante tener en cuenta todo esto para presentar a cada usuario su hora correcta en función de su huso horario.

En python he visto una cosa que en parte me ha gustado. Y es que los módulos por defecto de python, como datetime, sólo entienden de hora local y de hora UTC / GMT. No entienden de horas de otros países de una forma fácil. Siempre tenemos la opción de decir GMT+2 o GMT-4, pero desde luego eso obliga a saber ese incremento respeto a GMT para un país concreto. Y si encima vamos con horarios de verano e invierno, más lio, porque ese incremento cambia según la fecha del año.

¿Por qué digo que me ha gustado esto que aparentemente es una pega?. Porque como he comentado, el 99% de los casos no necesitamos más. La hora local va que chuta.

¿Y si queremos saber las horas de otros países?. Hay varios módulos, algunos ya instalados en python, como zoneinfo, que de alguna forma ayudan. Pero en una investigación superficial, no me he matado mirando, no los he visto suficientemente cómodos y completos. Pero sí me ha gustado el módulo adicional pytz, abreviatura de Python Timezone.

¿Cómo instalar el módulo pytz en Python?

La instalación es sencilla, python viene con un programa de nombre pip que permite instalar módulos externos desde internet. Este simple comando desde una ventana de comandos de Windows o Linux debería hacer el trabajo.

pip install pytz

Si todo va bien, se habrá instalado. Luego basta usarlo en cualquier función de datetime que admita como parámetro un timezone.

Por supuesto, en nuestro programa python debemos hacer antes los import correspondientes. Por ejemplo

from datetime import *
import pytz

pytz timezone de Madrid o de New York

Con pytz podemos obtener la hora de cualquier país. Por ejemplo, Madrid o New York (en azul la salida de los comandos)

>>> datetime.now(pytz.timezone(‘America/New_York’))
datetime.datetime(2022, 7, 30, 2, 43, 56, 551152, tzinfo=<DstTzInfo ‘America/New_York’ EDT-1 day, 20:00:00 DST>)

>>> datetime.now(pytz.timezone(‘Europe/Madrid’))
datetime.datetime(2022, 7, 30, 8, 44, 2, 924587, tzinfo=<DstTzInfo ‘Europe/Madrid’ CEST+2:00:00 DST>)

>>> datetime.now(pytz.timezone(‘CET’))
datetime.datetime(2022, 7, 30, 8, 44, 13, 512663, tzinfo=<DstTzInfo ‘CET’ CEST+2:00:00 DST>)

>>> datetime.now(pytz.timezone(‘Zulu’))
datetime.datetime(2022, 7, 30, 6, 44, 18, 40771, tzinfo=<StaticTzInfo ‘Zulu’>)

Ahí tenemos cuatro ejemplos para obtener la hora actual en New York, en Madrid, en CET (Central European Time, que coincide con la de Madrid) y en hora Zulu (similar a GMT y UTC).

pytz timezone UTC

O podemos convertir fechas de un país a otro

>>> utc= datetime(2022,7,4,5,6,7,123456,pytz.timezone(‘UTC’))
>>> utc
datetime.datetime(2022, 7, 4, 5, 6, 7, 123456, tzinfo=<StaticTzInfo ‘UTC’>)

>>> madrid = zulu.astimezone(pytz.timezone(‘Europe/Madrid’))
>>> madrid
datetime.datetime(2022, 7, 4, 7, 6, 7, 123456, tzinfo=<DstTzInfo ‘Europe/Madrid’ CEST+2:00:00 DST>)

Aquí obtenemos una fecha/hora concreto con timezone UTC y luego averiguamos qué hora era en Madrid en esa hora UTC, usando la función datetime.astimezone()

A partir de un timestamp también es sencillo

>>> timestamp = datetime.now().timestamp()
>>> datetime.fromtimestamp(timestamp)
datetime.datetime(2022, 7, 30, 9, 5, 36, 831705)

>>> datetime.fromtimestamp(timestamp, pytz.timezone(‘America/New_York’))
datetime.datetime(2022, 7, 30, 3, 5, 36, 831705, tzinfo=<DstTzInfo ‘America/New_York’ EDT-1 day, 20:00:00 DST>)

La función datetime.fromtimestamp() presupone hora local si no le ponemos parámetro, pero si le ponemos un timezone de parámetro, nos muestra el datetime en ese país.

pytz lista de timezones

Para saber qué timezone hay disponibles, la llamada pytz.all_timezones nos da un listado de todas las disponibles. El listado es muy largo, pongo aquí algunas de ejemplo

[‘Africa/Abidjan’, ‘Africa/Accra’, ‘Africa/Addis_Ababa’, ‘Africa/Algiers’, ‘Africa/Asmara’, ‘Africa/Asmera’, ‘Africa/Bamako’, ‘Africa/Bangui’, ‘Africa/Banjul’, ‘Africa/Bissau’, ‘Africa/Blantyre’, ‘Africa/Brazzaville’, ‘Afric

/Alaska’, ‘US/Aleutian’, ‘US/Arizona’, ‘US/Central’, ‘US/East-Indiana’, ‘US/Eastern’, ‘US/Hawaii’, ‘US/Indiana-Starke’, ‘US/Michigan’, ‘US/Mountain’, ‘US/Pacific’, ‘US/Samoa’, ‘UTC’, ‘Universal’, ‘W-SU’, ‘WET’, ‘Zulu’]

Esta entrada ha sido publicada en python y etiquetada como , , , , . Guarda el enlace permanente.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.