dateutil y pytz dan diferentes resultados

Tengo un problema al comparar salidas con dateutil y pytz . Estoy creando un objeto datetime (UTC) y luego lo convierto a una zona horaria determinada, pero obtengo respuestas diferentes. Sospecho que dateutil a veces da resultados erróneos porque tiene problemas teniendo en cuenta el horario de verano (al menos, leí un comentario al respecto) pero no puedo encontrar una confirmación o una solución para ese problema. Este es el código:

 import dateutil u = dateutil.tz.tzutc() date1 = datetime.datetime(2010, 5, 2, 11, 10, tzinfo=u) # 2010-05-02 11:10:00+00:00 u2 = dateutil.tz.gettz('America/Chicago') date2 = datetime.datetime(2010, 5, 2, 11, 10, tzinfo=u2) # 2010-05-02 11:10:00-05:00 import pytz u = pytz.timezone('UTC') date1 = datetime.datetime(2010, 5, 2, 11, 10, tzinfo=u) # 2010-05-02 11:10:00+00:00 u2 = pytz.timezone('America/Chicago') date2 = datetime.datetime(2010, 5, 2, 11, 10, tzinfo=u2) # 2010-05-02 11:10:00-06:00 

Entonces, ¿cuál podría ser el problema aquí?

ACTUALIZAR:

Acabo de intentar esto:

 print u2.normalize(date1.astimezone(u2)) # 2010-05-02 06:10:00-05:00 

¿Entonces Pytz necesita normalize para considerar DST?

ACTUALIZACIÓN 2:

Parecía que pytz y dateutil no daban la respuesta para America / Argentina / San_Luis pero esto funciona:

 import pytz, dateutil, datetime now = datetime.datetime.now() for zone in pytz.all_timezones: utc_dateutil = dateutil.tz.tzutc() utcdate_dateutil = datetime.datetime(now.year, now.month, now.day, now.hour, now.minute, tzinfo=utc_dateutil) zone_dateutil = dateutil.tz.gettz(zone) newzone_dateutil = utcdate_dateutil.astimezone(zone_dateutil) utc_pytz = pytz.timezone('UTC') utcdate_pytz = datetime.datetime(now.year, now.month, now.day, now.hour, now.minute, tzinfo=utc_pytz) zone_pytz = pytz.timezone(zone) newzone_pytz = utcdate_pytz.astimezone(zone_pytz) assert newzone_dateutil == newzone_pytz 

¿Me estoy perdiendo de algo?

Gracias

Edición: la discrepancia que se discute a continuación ya no existe al usar

 >>> dateutil.__version__ '1.5' >>> pytz.__version__ '2012c' 

El módulo pytz advierte ,

esta biblioteca difiere de la API de Python documentada para implementaciones tzinfo; Si desea crear horarios locales de Wallclock, debe utilizar el método localize ().

y más adelante

Esta biblioteca solo admite dos formas de construir una hora localizada. El primero es usar el método localize () provisto por la biblioteca pytz.

 In [61]: u4 = pytz.timezone('America/Chicago') In [62]: print(u4.localize(datetime.datetime(2010, 5, 2, 11, 10))) 2010-05-02 11:10:00-05:00 

La otra forma es usar el método astimezone , que se usa para convertir una fecha y hora con fecha horaria en otra fecha y hora con fecha y hora.

Y para ser completamente explícito, advierte contra la construcción de una fecha y hora que tenga en cuenta la zona horaria mediante el argumento tzinfo :

Desafortunadamente, el uso del argumento tzinfo de los constructores de fecha y hora estándar ” no funciona ” con pytz para muchas zonas horarias.


Probemos la hipótesis de que

 datetime.datetime(year, month, day, hour, minute, tzinfo = dateutil_tz) 

es igual a

 pytz_tz.localize(datetime.datetime(year, month, day, hour, minute)) 

con este código:

 import dateutil.tz import datetime import pytz now = datetime.datetime.now() for name in pytz.all_timezones: dateutil_tz = dateutil.tz.gettz(name) pytz_tz = pytz.timezone(name) dateutil_date = datetime.datetime( now.year, now.month, now.day, now.hour, now.minute, tzinfo = dateutil_tz) pytz_date = pytz_tz.localize(datetime.datetime( now.year, now.month, now.day, now.hour, now.minute)) try: assert dateutil_date.isoformat() == pytz_date.isoformat() except AssertionError: print(name) print(dateutil_date.isoformat()) print(pytz_date.isoformat()) 

El código produce:

 America/Argentina/San_Luis 2012-12-18T22:32:00-04:00 <-- dateutil datetime 2012-12-18T22:32:00-03:00 <-- pytz's datetime 

Así que mi hipótesis era errónea: dateutil y pytz devuelven resultados diferentes.

Entonces, ¿cuál es la correcta? No estoy realmente seguro, pero de acuerdo con este sitio web , actualmente,

 America/Argentina/San_Luis time zone offset is: UTC / GMT -03:00 hours 

por lo que parece pytz es correcta.