2015-06-17 12 views
5

Piszę skrypt Pythona, który zawiera dwa wiersze kodu konwersji datę został przekazany do metody do czasu UTC:Przesunięcie strefy czasowej w pythonie jest nieprawidłowe?

print "Timezone: %s" % get_localzone() 
date = datetime.now(tz=get_localzone()) 
print "Local time: %s" % date 
utc = pytz.utc 
utc_date = date.astimezone(utc) 
print "UTC date: %s" % utc_date 

a wynik jest:

Timezone: America/Chicago 
Local time: 2015-06-17 14:58:45.224827-05:00 
UTC date: 2015-06-17 19:58:45.224827+00:00 

jak można Patrz przesunięcie czasu lokalnego jest „-05: 00”, nic złego się z nim, ale kiedy utworzyć własny obiekt datetime o tej samej strefie czasowej:

date = datetime(2015, 6, 17, 14, 58, 45, tzinfo=get_localzone()) 

wynik stać s:

Timezone: America/Chicago 
Local time: 2015-06-17 14:58:45-05:51 

Przesunięcie zmieniono z "-05: 00" na "-05: 51". Użyłem nawet tego samego czasu, który wygenerował pierwszy "datetime.now()", a strefa czasowa się nie zmieniła, czy ktoś mógłby mi wyjaśnić, dlaczego tak się dzieje? Dzięki!

Odpowiedz

8

Zamiast przypisywać parametr tzinfo, należy użyć metody localize z pytz.

tz = get_localzone() 
date = tz.localize(datetime(2015, 6, 17, 14, 58, 45)) 

Jest to omówione w widocznym miejscu w the pytz documentation, począwszy od pierwszego „notatkę”, aw pierwszej próbki kodu.

Jest również wyświetlany w the tzlocal documentation, gdzie jest (zakładam) pochodzi twoja metoda get_localzone().

Twojej wiadomości, -05:51 przesunięcie pochodzi z oryginalnego LMT wartości strefie America/Chicago czasu, który jest -05:50:36 i zakłada się, że była używana w drodze powrotnej w 1883 as shown here. Jest zaokrąglana do najbliższej minuty, podając wartość LMT -05:51 w języku Python. Widać to przesunięcie, ponieważ metoda localize nie została wywołana, więc pytz używa właśnie pierwszego przesunięcia znanego dla tej strefy czasowej.

+0

Dzięki za szczegółową odpowiedź, to rozwiązało mój problem :) –

+1

@YueQiLi: uwaga: powinieneś użyć 'datetime.now (tz)' zamiast 'tz.localize (datetime.now())'. Ten ostatni może zawieść, jeśli czas lokalny jest niejednoznaczny (np. Podczas przejścia DST). Jeśli czas wejściowy nie jest teraz, możesz przekazać parametr 'is_dst' do' tz.localize() ', aby ujednoznacznić. – jfs

+0

@ J.F.Sebastian Dzięki, po prostu rzuciłem okiem na [dokumentację pytz] (http://pythonhosted.org/pytz/) i masz rację, dodam to do mojego kodu. O innym podobnym pytaniu, pomimo faktu, że oba nasze problemy są spowodowane niewłaściwym użyciem konstruktora datetime, dla początkujących takich jak ja trudno jest zaklasyfikować je do tego samego rodzaju problemu. Utrzymanie mojego będzie pomocne dla innych ludzi, aby uniknąć tego rodzaju błędu żółtodzioba :) –

Powiązane problemy