Utilizzare timedelta per alternare i fusi orari. Tutto ciò che serve è l'offset in ore tra i fusi orari. Non è necessario giocherellare con i limiti per tutti e 6 gli elementi di un oggetto datetime. timedelta gestisce facilmente anni bisestili, secoli bisestili, ecc. Devi prima
from datetime import datetime, timedelta
Quindi se offset
è il delta del fuso orario in ore:
timeout = timein + timedelta(hours = offset)
dove timein e timeout sono oggetti datetime. per esempio
timein + timedelta(hours = -8)
converte da GMT a PST.
Quindi, come determinare offset
? Ecco una semplice funzione a patto che tu abbia solo poche possibilità di conversione senza usare oggetti datetime che sono "consapevoli" del fuso orario che alcune altre risposte fanno bene. Un po 'manuale, ma a volte la chiarezza è la cosa migliore.
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)
Dopo aver esaminato le numerose risposte e aver giocato con il codice più stretto che mi viene in mente (per ora), sembra che tutte le applicazioni, dove il tempo è importante e i fusi orari misti devono essere considerati, dovrebbero fare uno sforzo reale per realizzare tutti gli oggetti datetime "consapevole". Quindi sembrerebbe che la risposta più semplice sia:
timeout = timein.astimezone(pytz.timezone("GMT"))
per convertire in GMT, ad esempio. Naturalmente, per convertire in / da qualsiasi altro fuso orario desiderato, locale o di altro tipo, basta usare la stringa di fuso orario appropriata che pytz comprende (da pytz.all_timezones). Viene quindi presa in considerazione anche l'ora legale.