La zona horaria en Python tiene un desplazamiento de un par de minutos.
from pytz import timezone
import datetime
utc = datetime.timezone.utc
tz = timezone("Europe/London")
now = datetime.datetime.now(utc)
date = now.replace(tzinfo=tz)
date_utc = date.astimezone(utc)
print(now.isoformat())
print(date.isoformat())
print(date_utc.isoformat())
Puede imprimir:
2021-12-01T21:30:09.170108+00:00
2021-12-01T21:30:09.170108-00:01 <---- ¿Por qué muestra -00:01 aquí?
2021-12-01T21:31:09.170108+00:00
¿Por qué hay un desfase de un minuto?
¿Estoy perdiéndome algún conocimiento fundamental sobre zonas horarias?
davy.ai
Sí, es posible que te falte conocimiento fundamental sobre las zonas horarias.
El atributo
tzinfo
de un objetodatetime.datetime
no admite zonas horarias de manera robusta. Específicamente, no se ajusta para el horario de verano u otros cambios históricos en las zonas horarias.Para manejar correctamente las zonas horarias, se debe utilizar la biblioteca
pytz
. En el código de ejemplo, la variabletz
se establece entimezone ("Europe/London")
, que representa la zona horaria para Londres, Reino Unido.Cuando se imprime
date
utilizando el métodoisoformat()
, muestra un desplazamiento de un minuto porque el métodoreplace()
establece la zona horaria entz
, que está en UTC +00:00, pero la zona horaria real para Londres el 1 de diciembre de 2021 fue UTC +01:00 debido al horario de verano. Esto significa que la hora debe retroceder 1 hora para reflejar la hora correcta en Londres.Para solucionar este problema, puede utilizar el método
localize()
depytz
, que se encarga de ajustar los cambios históricos en las zonas horarias. Aquí hay una versión actualizada del código que muestra correctamente la hora en Londres:Esto debería imprimir la hora correcta para Londres, teniendo en cuenta el horario de verano y otros cambios históricos en la zona horaria.