Użyj timedelta, aby przełączać się między strefami czasowymi. Wszystko czego potrzebujesz to przesunięcie w godzinach między strefami czasowymi. Nie musisz bawić się granicami dla wszystkich 6 elementów obiektu datetime. timedelta z łatwością radzi sobie z latami przestępnymi, stuleciami przestępnymi itp. Najpierw musisz
from datetime import datetime, timedelta
Jeśli offset
więc delta strefy czasowej w godzinach:
timeout = timein + timedelta(hours = offset)
gdzie timein i timeout są obiektami datetime. na przykład
timein + timedelta(hours = -8)
konwertuje z GMT na PST.
Jak więc ustalić offset
? Oto prosta funkcja, pod warunkiem, że masz tylko kilka możliwości konwersji bez użycia obiektów daty-godziny, które są „świadome” strefy czasowej, co robią niektóre inne odpowiedzi. Trochę manualnie, ale czasem klarowność jest najlepsza.
def change_timezone(timein, timezone, timezone_out):
'''
changes timezone between predefined timezone offsets to GMT
timein - datetime object
timezone - 'PST', 'PDT', 'GMT' (can add more as needed)
timezone_out - 'PST', 'PDT', 'GMT' (can add more as needed)
'''
# simple table lookup
tz_offset = {'PST': {'GMT': 8, 'PDT': 1, 'PST': 0}, \
'GMT': {'PST': -8, 'PDT': -7, 'GMT': 0}, \
'PDT': {'GMT': 7, 'PST': -1, 'PDT': 0}}
try:
offset = tz_offset[timezone][timezone_out]
except:
msg = 'Input timezone=' + timezone + ' OR output time zone=' + \
timezone_out + ' not recognized'
raise DateTimeError(msg)
return timein + timedelta(hours = offset)
Po zapoznaniu się z licznymi odpowiedziami i sprawdzeniu najściślejszego kodu, jaki mogę sobie wyobrazić (na razie) najlepiej wydaje się, że wszystkie aplikacje, w których czas jest ważny i należy uwzględnić mieszane strefy czasowe, powinny podjąć prawdziwy wysiłek, aby wszystkie obiekty datetime "świadomy". Wtedy wydaje się, że najprostszą odpowiedzią jest:
timeout = timein.astimezone(pytz.timezone("GMT"))
na przykład na konwersję do GMT. Oczywiście, aby przekonwertować na dowolną inną strefę czasową, lokalną lub inną, wystarczy użyć odpowiedniego ciągu strefy czasowej, który rozumie Pytz (z pytz.all_timezones). Uwzględniany jest także czas letni.