2014-06-23 10 views
6

Czy jest ktoś, kto może mi pomóc zrozumieć, co tu się dzieje?Dlaczego pytz localize() nie tworzy obiektu datetime z tzinfo pasującego do obiektu tz, który go zlokalizował?

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?" 

Moje zrozumienie, że metoda localize() na obiekcie czasowej pytz zajęłoby naiwny obiekt datetime i dodać obiekt tzinfo pasujący obiekt czasowej wykonywania lokalizację. Wydaje się, że nie dzieje się to w tym przypadku.

Najwyraźniej jest coś, czego nie rozumiem o strefach czasowych, lub o sposobie, w jaki pytz obsługuje strefy czasowe. Czy ktoś może wyjaśnić?

Odpowiedz

7

One w tej samej strefie czasowej - "Europe/Berlin".

Podczas drukowania ich wyniki zawierają skrót i przesunięcie obowiązujące w danym momencie.

Jeśli przyjrzysz the tz data sources, zobaczysz:

# 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 

Więc wydaje się, że jeśli strefa czasowa nie jest zlokalizowana datetime, to po prostu wykorzystuje pierwszy wpis.

Byłoby również pojawić że pytz nie zachowuje dodatkowe 28 sekund od pierwotnego miejscowego odchylenia średniego czasu - ale to nie ma znaczenia, chyba, że ​​pracujemy z datami w Berlinie przed kwietniem 1893 roku

+0

Dziękuję za Twój komentarz. Dobry połów na CET/CEST. To była zła kopia i wklej z mojej strony (teraz edytowane). Eksperymentowałem zarówno z datą oszczędności w świetle dziennym, jak iz datą, która nie była dostępna dla światła dziennego. Próbowałem uruchomić to w Pythonie 3.4 z najnowszym pytzem i otrzymałem ten sam wynik. Zobacz: https://gist.github.com/bjmc/59d8650ae3d2aebb7584 Twoje informacje na temat źródła danych tz są mile widziane. Czy to oznacza, że ​​atrybut 'tzinfo' z [nowoczesnej] zlokalizowanej daty nigdy nie byłby porównywalny z abstrakcyjnym obiektem strefy czasowej z pytz? – bjmc

+0

Ogólnie rzecz biorąc, nie uważam, że 'tzinfo' jest porównywalne z innym' tzinfo' bez konkretnej daty i godziny. Jeśli jednak wiesz, że oba obiekty pochodzą z pytz (lub z [tzlocal] (https://pypi.python.org/pypi/tzlocal)), możesz porównać ich właściwości '.zone', które zawierają tylko ciąg znaków identyfikator strefy ('" Europa/Berlin "'). –

+0

Nie jestem pewien, czy to jest odpowiedź. Powtarza się, że to problem. Problem występuje, gdy próbujesz zastąpić tzinfo obiektu datetime. –

Powiązane problemy