Comportamiento extraño de zona horaria en Python (pytz)
Estoy encontrando un problema extraño con las zonas horarias en Python que he reducido a algunas líneas de código:
from datetime import time, datetime
import pytz
tz = pytz.timezone('Canada/Pacific')
d = datetime.now(tz=tz)
t = time(tzinfo=tz)
Al inspeccionar los objetos tzinfo
en d
y t
, el objeto en t
da una zona horaria con un UTC-offset de 8:12, mientras que el objeto en d
da un UTC-offset de solo 8 horas, que es el offset correcto. La instancia tz
también da un UTC-offset de 8:12. ¿Qué pasa con los 12 minutos adicionales?
Me doy cuenta de que datetime.now()
depende de cuando se ejecute el código, así que diré que lo ejecuté unos minutos antes de publicar esto en StackOverflow y vi el mismo error. ¿Alguien más experimentado con zonas horarias puede ayudarme a encontrar la solución al problema?
davy.ai
El problema aquí se debe al hecho de que la clase
time
en el módulodatetime
de Python no tiene un concepto de hora de verano o DST. Al crear un objetotime
con un argumentotzinfo
, Python asume que el offset de la zona horaria permanece constante durante todo el año. Sin embargo, algunas zonas horarias observan DST y su offset cambia en momentos específicos del año.Por otro lado, al crear un objeto
datetime
con un argumentotzinfo
, Python tiene en cuenta las reglas de DST de la zona horaria y ajusta el offset en consecuencia.En este caso específico, la zona horaria
Canada/Pacific
observa DST, y en el momento en que se ejecutó el código, estaba en DST. Esto significa que el offset era UTC-7:00 en lugar del offset estándar UTC-8:00.Para evitar este problema, se recomienda siempre usar objetos
datetime
al trabajar con zonas horarias que observan DST. Si necesita representar solo la hora del día sin una fecha, puede extraer el componentetime
del objetodatetime
utilizando el métodotime()
. Alternativamente, puede utilizar una biblioteca de terceros comodateutil
que proporciona una clasetime
“tz-aware” (con conocimiento de la zona horaria).