¿Cómo hacer un objeto de fecha y hora consciente de la zona horaria en Python?

| | | | | | | | | | | | | | | | | | |

Qué debo hacer

Tengo un objeto de fecha y hora que no reconoce la zona horaria, al que necesito agregar una zona horaria para poder compararlo con otros Objetos de fecha y hora con reconocimiento de zona horaria. No quiero convertir toda mi aplicación a zona horaria sin reconocer la zona horaria para este caso heredado.

Lo que he intentado

Primero, demostrar el problema :

Python 2.6.1 (r261:67515, 24 de junio de 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. compilación 5646)] en darwin Escriba "ayuda" , "derechos de autor", "créditos" o "licencia" para obtener más información. ,15,8,15,12,0) >>> inconsciente datetime.datetime(2011, 8, 15, 8, 15, 12) >>> consciente = datetime.datetime(2011,8, 15,8,15,12,0,pytz.UTC) >>> consciente datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>) >>> consciente == no consciente Rastreo (última llamada más reciente): Archivo "<stdin>", línea 1, en <módulo> TypeError: no se pueden comparar las fechas y horas con compensación ingenua y compensación 

Primero, probé como zona horaria:

>>> unaware.astimezone(pytz.UTC) Rastreo (última llamada más reciente): Archivo "<stdin>", línea 1, en <module> ValueError: astimezone() no se puede aplicar a una fecha y hora ingenua >>> 

No es de extrañar que haya fallado, ya que en realidad está intentando realizar una conversión. Reemplazar parecía una mejor opción (según ¿Cómo obtengo un valor de datetime.today() en Python que es "consciente de la zona horaria"?):

>>> unaware.replace(tzinfo=pytz.UTC) datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>) >>> inconsciente == consciente Rastreo (última llamada más reciente): Archivo "<stdin>", línea 1, en <módulo> TypeError: no se pueden comparar las fechas y horas con offset ingenuo y con offset >>> 

Pero como puede ver, replace parece configurar tzinfo, pero no hacer que el objeto sea consciente Me estoy preparando para volver a manipular la cadena de entrada para tener una zona horaria antes de analizarla (estoy usando dateutil para analizar, si eso importa), pero eso parece increíblemente confuso.

Además, Probé esto tanto en Python 2.6 como en Python 2.7, con los mismos resultados.

Contexto

Estoy escribiendo un analizador para algunos archivos de datos. Hay un formato antiguo que debo admitir donde la cadena de fecha no tiene un indicador de zona horaria. Ya arreglé la fuente de datos, pero aún necesito admitir el formato de datos heredados. Una conversión única de los datos heredados no es una opción por varias razones comerciales BS. Aunque en general, no me gusta la idea de duro -Codificando una zona horaria predeterminada, en este caso parece ser la mejor opción. Sé con razonable confianza que todos los datos heredados en cuestión están en UTC, por lo que estoy preparado para aceptar el riesgo de usar eso de forma predeterminada en este caso.