2014-06-23 16 views
6

Gibt es jemanden, der mir helfen kann zu verstehen, was hier vor sich geht?Warum erzeugt pytz localize() kein Datetime-Objekt mit tzinfo, das mit dem tz-Objekt übereinstimmt, das es lokalisiert hat?

import pytz 
from datetime import datetime 
tz = pytz.timezone('Europe/Berlin') 
print repr(tz) 
# <DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD> 
dt = datetime(2011, 1, 3, 18, 40) 
result = tz.localize(dt) 
print repr(result.tzinfo) 
# <DstTzInfo 'Europe/Berlin' CET+1:00:00 STD> 
assert result.tzinfo == tz, "Why aren't these the same timezone?" 

Mein war Verständnis, dass die localize() Methode auf einem pytz Zeitzone Objekt wäre ein naives Datetime-Objekt zu nehmen, und fügen Sie eine tzinfo Eigenschaft, die die Zeitzone Objekt entspricht die Lokalisierung durchzuführen. Das scheint in diesem Fall nicht zu geschehen.

Offensichtlich gibt es etwas, was ich über Zeitzonen oder über die Art, wie pytz Zeitzonen behandelt, falsch verstehe. Kann mir jemand erklären?

Antwort

7

Sie sind die gleiche Zeitzone - "Europe/Berlin".

Wenn Sie sie drucken, enthält die Ausgabe die Abkürzung und den Offset, der zu diesem bestimmten Zeitpunkt gilt.

Wenn Sie the tz data sources untersuchen, werden Sie sehen:

# Zone NAME   GMTOFF RULES  FORMAT [UNTIL] 
Zone Europe/Berlin 0:53:28 -   LMT  1893 Apr 
         1:00  C-Eur  CE%sT 1945 May 24 2:00 
         1:00  SovietZone CE%sT 1946 
         1:00  Germany  CE%sT 1980 
         1:00  EU   CE%sT 

So wäre es, dass erscheinen, wenn die Zeitzone ein Datetime nicht lokalisiert hat, dann ist es nur der erste Eintrag verwendet.

Es wäre auch, dass pytz scheint nicht die zusätzliche 28 Sekunden aus der ursprünglichen lokalen mittleren Zeitabweichung behalten - aber das macht nichts, wenn Sie mit Terminen in Berlin vor April arbeiten 1893.

+0

Vielen Dank für Ihr Kommentar. Guter Fang an der CET/CEST. Das war eine schlechte Kopie-Paste meinerseits (jetzt bearbeitet). Ich hatte sowohl mit einem Sommerzeit- als auch mit einem Nicht-Sommerzeit-Datum experimentiert. Ich habe versucht, dies unter Python 3.4 mit dem neusten Pytz auszuführen, und habe dasselbe Ergebnis erzielt. Bitte beachten Sie: https://gist.github.com/bjmc/59d8650ae3d2aebb7584 Ihre Angaben zur tz-Datenquelle sind willkommen. Bedeutet dies, dass das 'tzinfo'-Attribut eines [modernen] lokalisierten Datums niemals mit dem abstrakten Zeitzonenobjekt von pytz gleich wäre? – bjmc

+0

Im Allgemeinen würde ich ein 'tzinfo' nie mit einem anderen' tzinfo' vergleichen können, ohne ein bestimmtes Datum und eine bestimmte Zeit zu berücksichtigen. Wenn Sie jedoch wissen, dass beide Objekte aus pytz stammen (oder aus [tzlocal] (https://pypi.python.org/pypi/tzlocal)), können Sie ihre '.zone'-Eigenschaften vergleichen, die nur die Zeichenkette von die Zonenkennung ("Europa/Berlin"). –

+0

Nicht sicher, das ist eine Antwort. Es ist nur zu wiederholen, dass es ein Problem ist. Das Problem tritt auf, wenn Sie versuchen, die TZInfo eines Datetime-Objekts zu ersetzen. –