835 Stimmen

Wie man ein zeitzonenbewusstes datetime-Objekt erstellt

Was ich tun muss

Ich habe ein zeitzonenunabhängiges datetime-Objekt, dem ich eine Zeitzone hinzufügen muss, um es mit anderen zeitzonenabhängigen datetime-Objekten vergleichen zu können. Ich möchte nicht meine gesamte Anwendung für diesen einen Legacy-Fall auf zeitzonenunabhängig umstellen.

Was ich ausprobiert habe

Erstens, um das Problem zu verdeutlichen:

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 dieser Versuch fehlgeschlagen ist, da es sich eigentlich um eine Konvertierung handelt. Ersetzen schien die bessere Wahl zu sein (wie bei Wie erhalte ich einen Wert von datetime.today() in Python, die "timezone aware" 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 replace die tzinfo zu setzen, aber das Objekt nicht bewusst zu machen. Ich bin immer bereit, fallen zurück zu doctoring die Eingabe-Zeichenfolge, um eine Zeitzone vor dem Parsen haben (ich bin mit dateutil für das Parsen, wenn das zählt), aber das scheint unglaublich kludgy.

Außerdem habe ich 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 keinen Zeitzonenindikator hat. Ich habe die Datenquelle bereits korrigiert, aber ich muss das alte Datenformat noch unterstützen. Eine einmalige Konvertierung der alten Daten ist aus verschiedenen BS-Gründen keine Option. Obwohl mir die Idee, eine Standardzeitzone hart zu kodieren, im Allgemeinen nicht gefällt, scheint es in diesem Fall die beste Option zu sein. Ich weiß mit ziemlicher Sicherheit, dass alle fraglichen Altdaten in UTC vorliegen, so dass ich bereit bin, das Risiko einzugehen, in diesem Fall auf diese Standardzeitzone zurückzugreifen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X