Come creare un oggetto datetime sensibile al fuso orario in Python?

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

Cosa devo fare

Ho un oggetto datetime inconsapevole del fuso orario, a cui devo aggiungere un fuso orario per poterlo confrontare con altri oggetti datetime in grado di riconoscere il fuso orario. Non voglio convertire la mia intera applicazione in fuso orario ignara di questo caso precedente.

Cosa ho provato

In primo luogo, per dimostrare il problema :

Python 2.6.1 (r261:67515, 24 giugno 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. build 5646)] su darwin Digita "help" , "copyright", "crediti" o "licenza" per ulteriori informazioni. >>> import datetime >>> import pytz >>> unware = datetime.datetime(2011,8 ,15,8,15,12,0) >>> inconsapevole datetime.datetime(2011, 8, 15, 8, 15, 12) >>> consapevole = datetime.datetime(2011,8, 15,8,15,12,0,pytz.UTC) >>> datatime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>) >>> consapevole == non consapevole Traceback (ultima chiamata più recente): File "<stdin>", riga 1, in <module> TypeError: impossibile confrontare datetime offset-naive e offset-aware 

In primo luogo, ho provato astimezone:

>>> unware.astimezone(pytz.UTC) Traceback (ultima chiamata più recente): File "<stdin>", riga 1, in <module> ValueError: astimezone() non può essere applicato a un datetime ingenuo >>> 

Non sorprende che questo non sia riuscito, poiché in realtà sta tentando di eseguire una conversione. Sostituire sembrava una scelta migliore (secondo Come ottengo un valore di datetime.today() in Python che sia "consapevole del fuso orario"?):

>>> unaware.replace(tzinfo=pytz.UTC) datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>) >>> inconsapevole == consapevole Traceback (ultima chiamata più recente): File "<stdin>", riga 1, in <module> TypeError: impossibile confrontare datetime offset-naive e offset-aware >>> 

Ma come puoi vedere, replace sembra impostare tzinfo, ma non rendere l'oggetto consapevole . Mi sto preparando a tornare a modificare la stringa di input per avere un fuso orario prima di analizzarla (sto usando dateutil per l'analisi, se questo è importante), ma sembra incredibilmente complicato.

Inoltre, L'ho provato sia in Python 2.6 che in Python 2.7, con gli stessi risultati.

Contesto

Sto scrivendo un parser per alcuni file di dati. C'è un vecchio formato che devo supportare in cui la stringa della data non ha un indicatore del fuso orario. Ho già corretto l'origine dati, ma ho ancora bisogno di supportare il formato dati legacy. Una conversione una tantum dei dati legacy non è un'opzione per vari motivi di business BS. Anche se in generale, non mi piace l'idea di hard -codificare un fuso orario predefinito, in questo caso sembra l'opzione migliore. So con ragionevole certezza che tutti i dati legacy in questione sono in formato UTC, quindi sono pronto ad accettare il rischio di inadempiere a quello in questo caso.