2015-01-29 3 views
5

wird angenommen, dass ich eine Zeitzone weniger datetime bezwecken:Assign Zeitzone zu einem Python-Datetime

import datetime 
import pytz 
fmt = "%Y-%m-%d %H:%M:%S %Z%z" 
dtUnaware = datetime.datetime(1979,2,20,6) 
print(dtUnaware.strftime(fmt)) 

Dies ergibt:

1979-02-20 06:00:00 

So weit, so gut. Jetzt möchte ich diesem Objekt eine Zeitzone zuweisen. Es scheint, als könnte ich entweder datetime.replace oder pytz.localize verwenden.

Erstens:

dtAware1 = dtUnaware.replace(tzinfo=pytz.timezone('Asia/Jerusalem')) 
print(dtAware1.strftime(fmt)) 

kehrt: 1979-02-20 06:00:00 LMT+0221. Zweitens:

dtAware2 = pytz.timezone('Asia/Jerusalem').localize(dtUnaware, is_dst=None) 
print(dtAware2.strftime(fmt)) 

gibt 1979-02-20 06:00:00 IST+0200 zurück.

Was ist los mit der ersten Methode? Es scheint eine falsche Zeitzone zuzuweisen. Mache ich etwas falsch?

Antwort

1

Aus Pytz-Dokumentation: Diese Bibliothek unterscheidet sich von der dokumentierten Python-API für Tzinfo-Implementierungen; wenn Sie lokale Wanduhr mal erstellen möchten, müssen Sie die localize() Methode in diesem Dokument dokumentiert verwenden ... Leider sind diese Probleme können nicht ohne Änderung der Python Datetime Implementierung gelöst werden (siehe PEP-431)

Meine Aus diesem Grund ist eine pytz Zeitzone nicht genau das gleiche wie eine Standardzeitzone. Wenn Sie eine echte Zeitzone hatten, sollte die erste Methode gut sein, aber Sie haben nicht.

1

Es gibt einen Fehler in der API datetime: Wenn Sie ihm eine Zeitzone zuweisen, erhält die Zeitzone nicht die Möglichkeit, das Datum und die Uhrzeit zu kennen, für die sie konfiguriert werden sollte. Die historische Datenbank, die pytz verwendet, geht weit zurück, oft zu Zeiten, in denen der Name oder der Offset der Zeitzone anders waren als die heute verwendeten. Ohne die Möglichkeit zu haben, sich an einen bestimmten Zeitraum anzupassen, können die Details der Zeitzone falsch sein.

Verwenden Sie localize ist die Art und Weise um dieses Problem zu umgehen, da sowohl das Datum und die Zeitzone innerhalb der Funktion zur gleichen Zeit verfügbar sind.

+0

eine gute Erklärung. Es kann sein, dass der Parameter localize() '' 'is_dst" erwähnt wird, der mehrdeutige und nicht existierende lokale Zeiten behandelt. Auch 'normalize()' Methode könnte nach 'localize()' für nicht existente lokale Zeit verwendet werden. – jfs