Was ich tun muss
Ich habe ein zeitzonenunabhängiges datetime-Objekt, zu dem ich eine Zeitzone hinzufügen muss, um es mit anderen zeitzonenbewussten datetime-Objekten vergleichen zu können. Ich möchte nicht meine gesamte Anwendung in eine Zeitzone konvertieren, ohne dass dies für diesen einen Legacy-Fall bekannt ist.
Was ich versucht habe
Um das Problem zu demonstrieren:
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> import pytz
>>> unaware = datetime.datetime(2011,8,15,8,15,12,0)
>>> unaware
datetime.datetime(2011, 8, 15, 8, 15, 12)
>>> aware = datetime.datetime(2011,8,15,8,15,12,0,pytz.UTC)
>>> aware
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> aware == unaware
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes
Zuerst habe ich Astimezone ausprobiert:
>>> unaware.astimezone(pytz.UTC)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: astimezone() cannot be applied to a naive datetime
>>>
Es ist nicht sonderlich überraschend, dass dies fehlgeschlagen ist, da tatsächlich versucht wird, eine Konvertierung durchzuführen. Ersetzen schien eine bessere Wahl zu sein (gemäß Python: Wie erhalte ich einen Wert von datetime.today (), der "zeitzonenbewusst" ist? ):
>>> unaware.replace(tzinfo=pytz.UTC)
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> unaware == aware
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes
>>>
Aber wie Sie sehen können, scheint Ersetzen das tzinfo zu setzen, aber das Objekt nicht bewusst zu machen. Ich bereite mich darauf vor, die Eingabezeichenfolge zu bearbeiten, um eine Zeitzone zu haben, bevor ich sie analysiere (ich verwende Dateutil zum Parsen, wenn das wichtig ist), aber das scheint unglaublich klobig.
Außerdem habe ich dies sowohl in Python 2.6 als auch in Python 2.7 mit den gleichen Ergebnissen versucht.
Kontext
Ich schreibe einen Parser für einige Datendateien. Es gibt ein altes Format, das ich unterstützen muss, wenn die Datumszeichenfolge keine Zeitzonenanzeige hat. Ich habe die Datenquelle bereits repariert, muss aber noch das ältere Datenformat unterstützen. Eine einmalige Konvertierung der Altdaten ist aus verschiedenen geschäftlichen BS-Gründen keine Option. Während mir die Idee, eine Standardzeitzone fest zu codieren, im Allgemeinen nicht gefällt, scheint sie in diesem Fall die beste Option zu sein. Ich weiß mit hinreichender Sicherheit, dass alle fraglichen Altdaten in UTC vorliegen, daher bin ich bereit, das Risiko zu akzeptieren, dass in diesem Fall dies nicht der Fall ist.
import datetime; datetime.datetime.now(datetime.timezone.utc)
tz
, um besser lesbar zu sein:datetime.datetime.now(tz=datetime.timezone.utc)
unaware.replace()
würde zurückkehren,None
wenn dasunaware
Objekt an Ort und Stelle geändert würde. Die REPL zeigt, dass hier.replace()
ein neuesdatetime
Objekt zurückgegeben wird.