2013-08-30 4 views
20

Ich versuche Timezone bewusst datetime Objekt zu UTC und dann zurück zu seiner ursprünglichen Zeitzone zu konvertieren. Ich habe einen folgenden AusschnittDatetime und Timezone Konvertierung mit Pytz - Geist weht Verhalten

t = datetime(
    2013, 11, 22, hour=11, minute=0, 
    tzinfo=pytz.timezone('Europe/Warsaw') 
) 

jetzt in ipython:

In [18]: t 
Out[18]: datetime.datetime(
    2013, 11, 22, 11, 0, tzinfo=<DstTzInfo 'Europe/Warsaw' WMT+1:24:00 STD> 
) 

und nun wollen wir versuchen, Umstellung auf UTC zu tun und zurück. Ich würde erwarten, die gleiche Darstellung haben, wie:

In [19]: t.astimezone(pytz.utc).astimezone(pytz.timezone('Europe/Warsaw')) 
Out[19]: datetime.datetime(
    2013, 11, 22, 10, 36, tzinfo=<DstTzInfo 'Europe/Warsaw' CET+1:00:00 STD> 
) 

Aber wir sehen, dass Out[18] und Out[19] unterscheiden. Was ist los?

+1

Django speichert Datetime naive Datenbank weise. Wenn Sie diesen Fall behandeln, sehen Sie hier, um Daten in die benötigte Zeitzone zu konvertieren: https://docs.djangoproject.com/en/dev/topics/i18n/timezones/#usage – Jingo

+0

ob Django naive Datumsangaben von nicht speichert gesteuert durch die Einstellung 'USE_TZ'. Wenn das "True" ist, behandelt Django Datumsangaben in Formularen usw. in der [aktuellen Zeitzone] (https://docs.djangoproject.com/en/dev/topics/i18n/timezones/#selecting-the-current-time -Zone) und speichert sie in der in UTC konvertierten Datenbank. – Anentropic

Antwort

44

Die Dokumentation http://pytz.sourceforge.net/ besagt "Leider funktioniert die Verwendung des TZInfo-Arguments des Standard-Datetime-Konstruktors nicht mit pytz für viele Zeitzonen." Der Code

t = datetime(
    2013, 5, 11, hour=11, minute=0, 
    tzinfo=pytz.timezone('Europe/Warsaw') 
) 

funktioniert nicht nach dieser, sondern sollten Sie die localize Methode verwenden:

t = pytz.timezone('Europe/Warsaw').localize(
     datetime(2013, 5, 11, hour=11, minute=0)) 
+0

Sehr gut zu wissen. – dgel

+0

Irgendeine Idee, was ist der Grund dafür? – yakxxx

+18

Das Python-Datetime-Modul geht davon aus, dass ein Zeitzonenobjekt einen konstanten UTC-Offset aufweist. Pytz-Zeitzonenobjekte haben unterschiedliche UTC-Offsets (weil sowohl die Sommerzeit als auch die historische Zeitzone geändert werden). Wenn Sie pytz's localize() verwenden, kann es den richtigen Offset für das bestimmte Datum aufnehmen. Wenn Sie datetime's replace (tzinfo ==) verwenden, erhalten Sie den ältesten UTC-Offset für diese Zeitzone in der Datenbank. –