Utilisez timedelta pour basculer entre les fuseaux horaires. Tout ce dont vous avez besoin est le décalage en heures entre les fuseaux horaires. Pas besoin de jouer avec les limites des 6 éléments d'un objet datetime. timedelta gère aussi facilement les années bissextiles, les siècles bissextiles, etc. Vous devez d'abord
from datetime import datetime, timedelta
Alors si offset
est le delta du fuseau horaire en heures:
timeout = timein + timedelta(hours = offset)
où timein et timeout sont des objets datetime. par exemple
timein + timedelta(hours = -8)
convertit de GMT à PST.
Alors, comment déterminer offset
? Voici une fonction simple à condition que vous n'ayez que quelques possibilités de conversion sans utiliser d'objets datetime qui sont «conscients» du fuseau horaire, ce que font bien d'autres réponses. Un peu manuel, mais parfois la clarté est meilleure.
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)
Après avoir examiné les nombreuses réponses et joué avec le code le plus serré auquel je puisse penser (pour l'instant), il semble préférable que toutes les applications, où le temps est important et où les fuseaux horaires mixtes doivent être pris en compte, fassent un réel effort pour créer tous les objets datetime. "conscient". Alors il semblerait que la réponse la plus simple soit:
timeout = timein.astimezone(pytz.timezone("GMT"))
pour convertir en GMT par exemple. Bien sûr, pour convertir vers / depuis n'importe quel autre fuseau horaire de votre choix, local ou autre, utilisez simplement la chaîne de fuseau horaire appropriée que pytz comprend (à partir de pytz.all_timezones). L'heure d'été est alors également prise en compte.