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.