Use timedelta para alternar entre fusos horários. Tudo o que você precisa é o deslocamento em horas entre os fusos horários. Não é necessário mexer nos limites dos 6 elementos de um objeto de data e hora. A timedelta lida com anos bissextos, séculos bissextos, etc., também com facilidade. Você deve primeiro
from datetime import datetime, timedelta
Então, se offset
é o delta do fuso horário em horas:
timeout = timein + timedelta(hours = offset)
onde timein e timeout são objetos de data e hora. por exemplo
timein + timedelta(hours = -8)
converte de GMT para PST.
Então, como determinar offset
? Aqui está uma função simples, desde que você tenha apenas algumas possibilidades de conversão sem usar objetos de data e hora que estejam "cientes" do fuso horário, o que algumas outras respostas agradam. Um pouco manual, mas às vezes a melhor clareza.
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)
Depois de examinar as numerosas respostas e brincar com o código mais rígido que consigo pensar (por enquanto), parece melhor que todos os aplicativos, nos quais o tempo é importante e os fusos horários mistos devam ser considerados, façam um esforço real para criar todos os objetos de data e hora "consciente". Parece que a resposta mais simples é:
timeout = timein.astimezone(pytz.timezone("GMT"))
para converter para GMT, por exemplo. Obviamente, para converter para / de qualquer outro fuso horário que você desejar, local ou não, basta usar a string de fuso horário apropriada que o pytz entende (de pytz.all_timezones). O horário de verão também é levado em consideração.