Looking for python Answers? Try Ask4KnowledgeBase
Looking for python Keywords? Try Ask4Keywords

Python Language Construire des datetimes dans le fuseau horaire


Exemple

Par défaut, tous les objets datetime sont naïfs. Pour les rendre compatibles avec le fuseau horaire, vous devez joindre un objet tzinfo , qui fournit le décalage UTC et l'abréviation du fuseau horaire en fonction de la date et de l'heure.

Zones de décalage fixe

Pour les fuseaux horaires à décalage fixe par rapport à UTC, dans Python 3.2+, le module datetime fournit la classe timezone , une implémentation concrète de tzinfo , qui prend un timedelta et un paramètre (facultatif) name:

Python 3.x 3.2
from datetime import datetime, timedelta, timezone
JST = timezone(timedelta(hours=+9))

dt = datetime(2015, 1, 1, 12, 0, 0, tzinfo=JST)
print(dt)
# 2015-01-01 12:00:00+09:00

print(dt.tzname())
# UTC+09:00

dt = datetime(2015, 1, 1, 12, 0, 0, tzinfo=timezone(timedelta(hours=9), 'JST'))
print(dt.tzname)
# 'JST'

Pour les versions Python antérieures à 3.2, il est nécessaire d'utiliser une bibliothèque tierce, telle que dateutil . dateutil fournit une classe équivalente, tzoffset , qui (à partir de la version 2.5.3) prend les arguments de la forme dateutil.tz.tzoffset(tzname, offset) , où le offset est spécifié en secondes:

Python 3.x 3.2
Python 2.x 2.7
from datetime import datetime, timedelta
from dateutil import tz

JST = tz.tzoffset('JST', 9 * 3600) # 3600 seconds per hour
dt = datetime(2015, 1, 1, 12, 0, tzinfo=JST)
print(dt)
# 2015-01-01 12:00:00+09:00
print(dt.tzname)
# 'JST'

Zones avec heure avancée

Pour les zones avec heure avancée, les bibliothèques standard python ne fournissent pas de classe standard, il est donc nécessaire d'utiliser une bibliothèque tierce. pytz et dateutil sont des bibliothèques populaires fournissant des classes de fuseau horaire.

En plus des fuseaux horaires statiques, dateutil fournit des classes de fuseau horaire qui utilisent l'heure d'été (voir la documentation du module tz ). Vous pouvez utiliser la méthode tz.gettz() pour obtenir un objet de fuseau horaire, qui peut ensuite être transmis directement au constructeur datetime :

from datetime import datetime
from dateutil import tz
local = tz.gettz() # Local time
PT = tz.gettz('US/Pacific') # Pacific time

dt_l = datetime(2015, 1, 1, 12, tzinfo=local) # I am in EST
dt_pst = datetime(2015, 1, 1, 12, tzinfo=PT)
dt_pdt = datetime(2015, 7, 1, 12, tzinfo=PT) # DST is handled automatically
print(dt_l)
# 2015-01-01 12:00:00-05:00
print(dt_pst)
# 2015-01-01 12:00:00-08:00
print(dt_pdt)
# 2015-07-01 12:00:00-07:00

ATTENTION : à partir de la version 2.5.3, dateutil ne gère pas correctement les dateutil ambiguës et utilisera toujours la date ultérieure par défaut. Il n'y a aucun moyen de construire un objet avec un dateutil fuseau horaire représentant, par exemple 2015-11-01 1:30 EDT-4 , puisque c'est au cours d' une transition heure d'été.

Tous les cas de bord sont traités correctement lors de l'utilisation de pytz , mais les pytz horaires pytz ne doivent pas être directement liés aux fuseaux horaires via le constructeur. Au lieu de cela, un pytz horaire pytz doit être attaché en utilisant la méthode de localize du fuseau horaire:

from datetime import datetime, timedelta
import pytz

PT = pytz.timezone('US/Pacific')
dt_pst = PT.localize(datetime(2015, 1, 1, 12))
dt_pdt = PT.localize(datetime(2015, 11, 1, 0, 30))
print(dt_pst)
# 2015-01-01 12:00:00-08:00
print(dt_pdt)
# 2015-11-01 00:30:00-07:00

Sachez que si vous effectuez une arithmétique datetime sur un pytz horaire pytz pytz, vous devez soit effectuer les calculs en UTC (si vous voulez un temps écoulé absolu), soit appeler normalize() sur le résultat:

dt_new = dt_pdt + timedelta(hours=3) # This should be 2:30 AM PST
print(dt_new)
# 2015-11-01 03:30:00-07:00
dt_corrected = PT.normalize(dt_new)
print(dt_corrected)
# 2015-11-01 02:30:00-08:00