2012-10-09 3 views
5

Mögliche Duplizieren:
Weird timezone issue with pytzpytz 'America/Edmonton' falschen Offset

Dies scheint falsch:

>>> import pytz 
>>> z1 = timezone('America/Edmonton') 
>>> z2 = timezone('US/Mountain') 
>>> z1 
<DstTzInfo 'America/Edmonton' LMT-1 day, 16:26:00 STD> 
>>> z2 
<DstTzInfo 'US/Mountain' MST-1 day, 17:00:00 STD> 
>>> pytz.VERSION 
'2012f' 
>>> 

'America/Edmonton' und ‚US/Eastern 'sollte die gleiche Zeitzone sein (17:00:00 STD). Ganz zu schweigen von 16:26:00 macht keinen Sinn.

- Update -

Die oben macht Sinn in Zusammenhang mit Jon Skeet Antwort. Allerdings komisch, wenn ich das mache:

>>> d = datetime.now() 
>>> d 
datetime.datetime(2012, 10, 9, 15, 21, 41, 644706) 

Ich habe ein naives Datum erstellt. Seit ‚America/Edmonton‘ ist meine Zeitzone, versuche ich, dass auch manuell einstellen:

>>> d2 = d.replace(tzinfo=timezone('America/Edmonton')) 
>>> d2 
datetime.datetime(2012, 10, 9, 15, 21, 41, 644706, tzinfo=<DstTzInfo 'America/Edmonton' LMT-1 day, 16:26:00 STD>) 

Dies soll nichts ändern, weil das die richtige TZ ist. Allerdings:

>>> d2.astimezone(timezone('US/Eastern')) 
datetime.datetime(2012, 10, 9, 18, 55, 41, 644706, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>) 

Das sollte mir einen Versatz von 2 Stunden (Differenz zwischen 'US/Eastern' und 'America/Edmonton'), aber es gibt mir 3 Stunden 26 Minuten (die 2 Stunden Plus ein Stunde 26 Minuten: D)

Das Einfügen timezone('US/Mountain') ergibt das korrekte Ergebnis in astimezone(). Das Erstellen einer bewussten Datetime mit 'America/Edmonton' funktioniert ebenfalls korrekt.

+0

Was passiert, wenn Sie die 'datetime' mit der Zeitzone erstellen, anstatt mit' replace' zu ​​beginnen? (Es sieht aus wie das ist im Grunde gebrochen ...) –

+0

Dann funktioniert es gut. Leider ist das in meinem Fall keine Option, da die naive Datetime von einer anderen Funktion zurückgegeben wird, die ich nicht kontrollieren kann :( – Goro

Antwort

9

Die documentation for pytz sagt explizit, dass das Erstellen einer Datetime direkt aus einer Zeitzone nicht funktioniert alle Fälle und weist Sie stattdessen an, Folgendes zu tun:

+1

ah. RTFM :) – Goro

3

an den 2012c Blick TZDB Daten, hier ist der Regelsatz für Amerika/Edmonton:

Zone America/Edmonton -7:33:52 -  LMT 1906 Sep 
         -7:00 Edm  M%sT 1987 
         -7:00 Canada M%sT 

Es ist mir nicht klar, was für Datum/Uhrzeit der Python Ausgabe versucht, Ihnen zu zeigen, den Offset/Namen, aber ich verdächtigen es ist etwas wie 1900 - in diesem Fall die 16:26:00 macht einen Sinn mit dem Offset von -7: 33: 52, und es würde auch die Abkürzung übereinstimmen.

So ist es durchaus machbar, dass die Zeitzone Daten in Ordnung ist, und es ist nur auswählen, zeigen Sie ein ungerades Datum/Uhrzeit als ein Beispiel. (Es macht keinen Sinn für mich, dass der String-Ausgang einer Zeitzone überhaupt eine Zeit anzeigt, um ehrlich zu sein ...)

+2

Bis Sie versuchen, die Zeitzone an ein Datum/eine Zeit anzuhängen, zeigt sie die früheste Definition an, die sie enthält –

+0

@MarkRansom: Das würde es sicherlich erklären, ja ... –

+0

ah, das macht dann Sinn.Allerdings sehe ich immer noch seltsame Dinge, wenn ich versuche, astimezone() zu verwenden - oben natürlich ausgearbeitet – Goro

Verwandte Themen