es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí se debe al hecho de que la clase time en el módulo datetime de Python no tiene un concepto de hora de verano o DST. Al crear un objeto time con un argumento tzinfo, 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 argumento tzinfo, 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 componente time del objeto datetime utilizando el método time(). Alternativamente, puede utilizar una biblioteca de terceros como dateutil que proporciona una clase time “tz-aware” (con conocimiento de la zona horaria).

Comments are closed.