Jak zrobić obiekt datetime uwzględniający strefę czasową w Pythonie?

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

Co muszę zrobić

Mam obiekt daty/czasu nie rozpoznający strefy czasowej, do którego muszę dodać strefę czasową, aby móc ją porównać z innymi obiekty daty i godziny zależne od strefy czasowej. Nie chcę konwertować całej mojej aplikacji na niezależną od strefy czasowej dla tego jednego starszego przypadku.

Czego próbowałem

Po pierwsze, aby zademonstrować problem :

Python 2.6.1 (r261:67515, 24 czerwca 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. build 5646)] na darwin Wpisz "help" , „prawa autorskie”, „kredyty” lub „licencja”, aby uzyskać więcej informacji. >>>import datetime >>>import pytz>>nieświadomy = datetime.datetime(2011,8 ,15,8,15,12,0) >>> nieświadomy datetime.datetime(2011, 8, 15, 8, 15, 12) >>>> świadomy = datetime.datetime(2011,8, 15,8,15,12,0,pytz.UTC) >> świadomy datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=) >>> świadomy == unaware Traceback (ostatnie wywołanie ostatnie): Plik „<stdin>”, wiersz 1, w <module> Błąd typu: nie można porównać dat naiwnych i uwzględniających offset 

Najpierw wypróbowałem astimezone:

>>> unaware.astimezone(pytz.UTC) Traceback (ostatnie wywołanie ostatnie): Plik „<stdin>”, wiersz 1, w <module> ValueError: astimezone() nie można zastosować do naiwnej daty i godziny >>> 

Nic dziwnego, że to się nie powiodło, ponieważ w rzeczywistości próbuje dokonać konwersji. Zamień wydawał się lepszym wyborem (zgodnie z Jak uzyskać wartość datetime.today() w Pythonie, która jest „świadoma strefy czasowej”?):

>>> unaware.replace(tzinfo=pytz.UTC) datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>) >>> unaware == świadomy Traceback (ostatnie wywołanie jako ostatnie): Plik „<stdin>”, wiersz 1, w <module> TypeError: can"t Compare offset-naive and offset-aware datetimes >>> 

Ale jak widać, polecenie replace wydaje się ustawiać tzinfo, ale nie sprawia, że obiekt jest świadomy . Przygotowuję się do powrotu do poprawiania ciągu wejściowego, aby mieć strefę czasową przed analizowaniem (używam dateutil do analizowania, jeśli to ma znaczenie), ale wydaje się to niewiarygodnie niezręczne.

Ponadto, Próbowałem tego zarówno w Pythonie 2.6, jak i Pythonie 2.7, z tymi samymi wynikami.

Kontekst

Piszę parser dla niektórych plików danych. Istnieje stary format, który muszę obsługiwać, w którym ciąg daty nie ma wskaźnika strefy czasowej. Naprawiłem już źródło danych, ale nadal muszę obsługiwać stary format danych. Jednorazowa konwersja starszych danych nie jest opcją z różnych biznesowych powodów BS. Chociaż ogólnie nie podoba mi się pomysł twardego -kodowanie domyślnej strefy czasowej, w tym przypadku wydaje się to najlepszą opcją.Wiem z rozsądną pewnością, że wszystkie dane starsze, o których mowa, są w UTC, więc jestem gotów zaakceptować ryzyko niewykonania zobowiązania w tym przypadku.