¿Por qué el tzinfo de datetime consciente de la zona horaria no es igual a la zona horaria?

>>> import pytz >>> tz = pytz.timezone('America/Chicago') >>> dt_naive = datetime(year=2017, month=6, day=6) >>> dt_aware = tz.localize(dt_naive) >>> dt_aware.tzinfo == tz False 

¿Cuál es la razón para que estos difieran?

 >>> dt_aware.tzinfo  >>> tz  

La clave que determina la zona horaria de pytz es la cadena que pasó para crear el objeto: 'America/Chicago' . Esa clave está disponible a través del atributo .zone .

 >>> tz = pytz.timezone('America/Chicago') >>> dt_naive = datetime(year=2017, month=6, day=6) >>> dt_aware = tz.localize(dt_naive) >>> dt_aware.tzinfo == tz False >>> tz.zone 'America/Chicago' >>> dt_aware.tzinfo.zone == tz.zone True 

El primero se ajustó a la fecha y hora provistas, 2016-06-06T00:00:00 . El horario de verano central (CDT) está vigente en este momento. Es 5 horas detrás de UTC ( 24:00 - 05:00 = 19:00 ).

El segundo no se ha localizado, por lo que le está dando el primer desplazamiento en los datos de zona horaria disponibles, que es la entrada de la hora media local (LMT) . Puedes ver esto en las fonts de tzdata aquí . El LMT está 5 horas, 50 minutos y 36 segundos por detrás de UTC. Los segundos del desplazamiento LMT se redondean en algún lugar de pytz, por lo que 18:09 lo refleja correctamente ( 24:00 - 05:51 = 18:09 )