2013-08-30 12 views
20

Próbuję przekonwertować obiekt strefy czasowej datetime na UTC, a następnie z powrotem na jego oryginalną strefę czasową. Mam następujący fragmentKonwersja datetime i strefy czasowej z pytzem - zachowanie dmuchanie umysłem

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

teraz w ipython:

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

i teraz spróbujmy zrobić konwersję do UTC iz powrotem. Spodziewam się, aby mieć taką samą reprezentację jako:

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> 
) 

Jednak widzimy, że Out[18] i Out[19] różnią. Co się dzieje?

+1

sklepy Django datetimes naiwny bazy mądry. Jeśli zajmiesz się tą sprawą, zajrzyj tutaj, aby przekonwertować daty na strefę czasową, której potrzebujesz: https://docs.djangoproject.com/en/dev/topics/i18n/timezones/#usage – Jingo

+0

czy Django przechowuje naiwne datetimes z nie jest kontrolowane przez ustawienie "USE_TZ". Jeśli jest to "True", wówczas Django traktuje datetime w formularzach itp. Jako będące w [bieżącej strefie czasowej] (https://docs.djangoproject.com/en/dev/topics/i18n/timezones/#selecting-the-current-time -zone) i przechowuje je w db zamienionym na UTC. – Anentropic

Odpowiedz

44

Dokumentacja http://pytz.sourceforge.net/ stwierdza "Niestety użycie argumentu tzinfo standardowych konstruktorów datetime" nie działa "z pytz dla wielu stref czasowych." Kod

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

nie działa zgodnie z tym, zamiast należy użyć metody lokalizowania:

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

Bardzo dobrze wiedzieć. – dgel

+0

Każdy pomysł, jaki jest tego powód? – yakxxx

+18

Moduł datetime Python zakłada, że ​​obiekt strefy czasowej ma stałe przesunięcie UTC. Obiekty strefy czasowej Pytz mają różne przesunięcia UTC (ponieważ czasy letnie, a także historyczne zmiany stref czasowych). Gdy użyjesz polecenia localize(), możesz pobrać właściwe przesunięcie dla tej konkretnej daty. Gdy użyjesz wymiany datetime (tzinfo ==), otrzymasz najstarsze przesunięcie UTC dla tej strefy czasowej w bazie danych. –