Wie erstelle ich ein zeitzonenbewusstes Datetime-Objekt in Python?

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

Was ich tun muss

Ich habe ein datetime-Objekt, das keine Zeitzone kennt, dem ich eine Zeitzone hinzufügen muss, um es mit anderen vergleichen zu können zeitzonenbewusste datetime-Objekte. Ich möchte nicht meine gesamte Anwendung für diesen einen Legacy-Fall in eine Zeitzonenunkenntnis umwandeln.

Was ich versucht habe

Zunächst das Problem demonstrieren :

Python 2.6.1 (r261:67515, 24. Juni 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. build 5646)] auf darwin Geben Sie "help" , "copyright", "credits" oder "license" für weitere Informationen. >>> import datetime >>> import pytz >>> unaware = datetime.datetime(2011,8 ,15,8,15,12,0) >>> unbewusst datetime.datetime(2011, 8, 15, 8, 15, 12) >>> bewusst = datetime.datetime(2011,8, 15,8,15,12,0,pytz.UTC) >>> bewusst datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>) >>> bewusst == nicht bewusst Traceback (letzter Aufruf zuletzt): Datei "<stdin>", Zeile 1, in <module> TypeError: kann offset-naive und offset-aware datetimes nicht vergleichen 

Zuerst habe ich astimezone ausprobiert:

>>> unaware.astimezone(pytz.UTC) Traceback (letzter Aufruf zuletzt): Datei "<stdin>", Zeile 1, in <module> ValueError: astimezone() kann nicht auf eine naive datetime >>> 

Es ist nicht sehr überraschend, dass dies fehlgeschlagen ist, da es tatsächlich versucht, eine Konvertierung durchzuführen. Ersetzen schien eine bessere Wahl zu sein (gemäß Wie erhalte ich einen Wert von datetime.today() in Python, der "zeitzonenbewusst" ist?):

>>> unaware.replace(tzinfo=pytz.UTC) datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>) >>> unaware == bewusst Traceback (letzter Aufruf zuletzt): Datei "<stdin>", Zeile 1, in <module> TypeError: kann offset-naive und offset-bewusste Datetimes nicht vergleichen >>> 

Aber wie Sie sehen können, scheint replace die tzinfo zu setzen, aber das Objekt nicht darauf aufmerksam zu machen . Ich bereite mich darauf vor, den Eingabe-String wieder zu manipulieren, um eine Zeitzone zu erhalten, bevor ich ihn parse (ich verwende dateutil zum Parsing, falls das wichtig ist), aber das scheint unglaublich klobig zu sein.

Außerdem, Ich habe dies sowohl in Python 2.6 als auch in Python 2.7 versucht, mit den gleichen Ergebnissen.

Kontext

Ich schreibe einen Parser für einige Datendateien. Es gibt ein altes Format, das ich unterstützen muss, bei dem die Datumszeichenfolge keine Zeitzonenanzeige hat. Ich habe die Datenquelle bereits repariert, muss aber noch das Legacy-Datenformat unterstützen. Eine einmalige Konvertierung der Legacy-Daten ist aus verschiedenen geschäftlichen BS-Gründen keine Option. Im Allgemeinen mag ich die Idee von Hard nicht - Codierung einer Standardzeitzone, in diesem Fall scheint dies die beste Option zu sein. Ich weiß mit angemessener Sicherheit, dass alle fraglichen Altdaten in UTC vorliegen, daher bin ich bereit, das Risiko einer Nichteinhaltung dieser Zeitzone in diesem Fall zu akzeptieren.