Pytz: Timezone en Python
Geograficamente, los paises cuentan con diferentes horarios. Gracias a las zonas horarias podemos identificar la fecha y hora de cualquier pais. Crear aplicaciones sin entender este tema, se puede volver complicado.
Tabla de contenido
Introducción
Las zonas horarias se clasifican en relación al meridiano cero, y, de acuerdo a cada posición, la hora es completamente distinta. Cabe mencionar que la diferencia entre cada zona horaria es de una hora y eso facilita aún más los cálculos para nosotros los humanos.
De acuerdo al lugar donde te encuentres, debes saber que al menos estás en una zona horaria. Existen países que cuentan con más de una y es importante enterarte en que zona horaria te encuentras.
Ejemplos
Tenemos las zonas horarias de Ciudad de México, Bogotá y Moscú:
- America/Bogota
(UTC-5:00)
- America/Mexico_City
(UTC-6:00)
- Europe/Moscow
(UTC+3:00)
Los números en UTC es en relación al meridiano cero. En el momento de hacer esta publicación, la hora UTC es 04:47:53.
Quiere decir que si queremos calcular la hora de Bogotá, Ciudad de México y Moscú en base al UTC (hora actual 04:47:53), entonces quedaría lo siguiente:
- Ciudad de México
22:47:53
- Bogotá
23:47:53
- Moscú
07:47:53
Fijaos que la zona horaria está expresada tanto en horas negativas como positivas para las ciudades. Es por eso que se le restan 5 y 6 horas y se le suman 3 horas en base a la hora UTC.
La libreria pytz
Esta librería nos ayuda a simplificar los calculos realizados para los tiempos de fecha y hora en base a una zona horaria en especifica.
Obtenemos las instancias de la zona horaria para Ciudad de México, Bogotá y Moscú.
import pytz
# Obtenemos las instancias de las zonas horarias
zonahoraria_mexico = pytz.timezone('America/Mexico_City')
zonahoraria_rusia = pytz.timezone('Europe/Moscow')
Obtenemos la hora actual. Para ellos nos apoyaremos de la función datetime
.
from datetime import datetime
hora_actual = datetime.now()
Creamos una instancia de la zona horaria para cada país.
import pytz
zonahoraria_mexico = pytz.timezone('America/Mexico_City')
zonahoraria_bogota = pytz.timezone('America/Bogota')
zonahoraria_rusia = pytz.timezone('Europe/Moscow')
Como me encuentro en la Ciudad de Mexico, localizo la hora actual basado en su misma zona horaria.
hora_cdmx = zonahoraria_cdmx.localize(hora_actual)
#
# Mexico: 2020-03-09 22:47:53.301803-06:00
Ya tengo la hora de la Ciudad de México, seguidamente obtengo la hora de Moscú y de Bógota desde la hora de mi ubicación. Vean que uso la variable hora_cdmx
.
hora_moscu = hora_cdmx.astimezone(zonahoraria_moscu)
hora_bogota = hora_cdmx.astimezone(zonahoraria_bogota)
#
# Bogota: 2020-03-09 23:47:53.301803-05:00
# Rusia: 2020-03-10 07:47:53.301803+03:00
Si queremos obtener la hora del UTC basado en la hora de Ciudad de México, entonces hacemos lo siguiente. Vean que sigo usando la variable hora_cdmx
.
zona_utc = pytz.timezone('UTC')
hora_utc = hora_cdmx.astimezone(zona_utc)
#
# Hora UTC: 2020-03-10 04:47:53.301803+00:00
Nos hace falta imprimir el resultado. Como somos profesionales :P usaremos textwrap
para hacerlo más elegante. Aquí va el código completo.
from datetime import datetime
import pytz
import textwrap
zonahoraria_utc = pytz.timezone('UTC')
zonahoraria_cdmx = pytz.timezone('America/Mexico_City')
zonahoraria_bogota = pytz.timezone('America/Bogota')
zonahoraria_moscu = pytz.timezone('Europe/Moscow')
hora_actual = datetime.now()
hora_cdmx = zonahoraria_cdmx.localize(hora_actual)
hora_utc = hora_cdmx.astimezone(zonahoraria_utc)
hora_moscu = hora_cdmx.astimezone(zonahoraria_moscu)
hora_bogota = hora_cdmx.astimezone(zonahoraria_bogota)
log = textwrap.dedent(('\n'
' Hora UTC: {0}\n'
' Mexico: {1}\n'
' Bogota: {2}\n'
' Rusia: {3}\n')
.format(
hora_utc, hora_cdmx, hora_bogota, hora_moscu)
)
print(log)
Llegó el momento que tanto esperamos. Aquí va un print del resultado.
Hora UTC: 2020-03-10 04:47:53.869068+00:00
Mexico: 2020-03-09 22:47:53.869068-06:00
Bogota: 2020-03-09 23:47:53.869068-05:00
Rusia: 2020-03-10 07:47:53.869068+03:00
Muy bien. Hemos concluído el dia de hoy. Más adelante veremos cómo pytz
funciona en Django, puesto que ya lo trae incluído.
Nos leemos en la próxima. Bendiciones!