Verwenden Sie timedelta, um zwischen Zeitzonen zu wechseln. Sie benötigen lediglich den Versatz in Stunden zwischen den Zeitzonen. Sie müssen nicht mit den Grenzen für alle 6 Elemente eines datetime-Objekts herumspielen. timedelta bewältigt auch Schaltjahre, Schaltjahrhundert usw. mühelos. Sie müssen zuerst
from datetime import datetime, timedelta
Wenn offset
dann das Zeitzonendelta in Stunden ist:
timeout = timein + timedelta(hours = offset)
Dabei sind timein und timeout datetime-Objekte. z.B
timein + timedelta(hours = -8)
konvertiert von GMT zu PST.
Also, wie zu bestimmen offset
? Hier ist eine einfache Funktion, vorausgesetzt, Sie haben nur wenige Möglichkeiten zur Konvertierung, ohne datetime-Objekte zu verwenden, die zeitzonenbewusst sind, was einige andere Antworten gut tun. Ein bisschen manuell, aber manchmal ist Klarheit am besten.
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)
Nachdem ich mir die zahlreichen Antworten angesehen und mit dem engsten Code herumgespielt habe, den ich mir (vorerst) vorstellen kann, scheint es am besten, dass alle Anwendungen, bei denen Zeit wichtig ist und gemischte Zeitzonen berücksichtigt werden müssen, echte Anstrengungen unternehmen sollten, um alle Datums- / Uhrzeitobjekte zu erstellen "bewusst". Dann scheint die einfachste Antwort zu sein:
timeout = timein.astimezone(pytz.timezone("GMT"))
zum Beispiel auf GMT umstellen. Um in eine andere Zeitzone zu konvertieren, die lokal oder anderweitig gewünscht wird, verwenden Sie einfach die entsprechende Zeitzonenzeichenfolge, die pytz versteht (aus pytz.all_timezones). Die Sommerzeit wird dann ebenfalls berücksichtigt.