Comment puis-je convertir un objet datetime Python en UTC?
J'ai un objet datetime Python que je voudrais convertir en UTC. Je prévois de le sortir au format RFC 2822 pour le mettre dans un en-tête HTTP, mais je ne suis pas sûr si cela compte pour cette question. J'ai trouvé des informations sur ce site sur la conversion d'objets time, et cela semble plus simple, mais cette fois je veux vraiment utiliser des objets datetime, car j'utilise timedeltas pour les ajuster:
J'ai essayé quelque chose comme ceci:
from datetime import datetime, timedelta
now = datetime.now()
fiveMinutesLater = datetime.now() + timedelta(minutes=5)
fiveMinutesLaterUtc = ???
Rien dans le temps ou datetime le module semble que ça m'aiderait. Il semble que je puisse le faire en passant l'objet datetime à travers 3 ou 4 fonctions, mais je me demande s'il existe un moyen plus simple.
Je préférerais ne pas utiliser de modules tiers, mais je peux le faire si c'est le seul choix raisonnable.
8 réponses
from datetime import datetime, timedelta
datetime.utcnow() + timedelta(minutes=5)
Vous devez D'abord vous assurer que le datetime est un objet sensible au fuseau horaire en définissant son membre tzinfo
:
Http://docs.python.org/library/datetime.html#datetime.tzinfo
Vous pouvez ensuite utiliser la fonction .astimezone()
pour la convertir:
Http://docs.python.org/library/datetime.html#datetime.datetime.astimezone
Pour ceux qui ont fini ici à la recherche d'un moyen de convertir un objet datetime en secondes UTC depuis L'époque UNIX:
import time
import datetime
t = datetime.datetime.now()
utc_seconds = time.mktime(t.timetuple())
Vous pouvez utiliser la méthode formatdate dans l'e-mail.Module Utils comme suit
>>> from email.Utils import formatdate
>>> print formatdate()
Sun, 25 Jul 2010 04:02:52 -0000
Ce qui précède est l'Heure de la date au format RFC 2822. Par défaut, il renvoie l'heure UTC mais au cas où vous auriez besoin d'heure locale, vous pouvez appeler formatdate (localtime=True).
Pour plus d'informations n'vérifier http://docs.python.org/library/email.mime.html#module-email.util
J'ai trouvé un moyen de prendre l'heure actuelle, d'y ajouter un objet timedelta, de convertir le résultat en UTC et de le sortir dans la RFC 2822:
time.strftime("%a, %d-%b-%Y %H:%M:%S GMT",
time.gmtime(time.time() + datetime.timedelta(minutes=5).seconds))
Cela n'a pas exactement répondu à ma question, mais je la mets ici parce que cela peut aider quelqu'un d'autre dans ma situation.
EDIT: je voudrais ajouter que cette astuce ne fonctionne que si le timedelta est inférieur à un jour. Si vous voulez quelque chose qui fonctionne avec n'importe quelle valeur timedelta, vous pouvez utiliser timedelta.total_seconds()
(pour Python 2.7 et versions ultérieures), ou avec 86400*timedelta.days + timedelta.seconds
. Je n'ai pas vraiment essayé cela, donc je ne suis pas sûr à 100% si cela fonctionnera.
Pour convertir en UTC à partir d'une chaîne de date:
from time import mktime
from datetime import datetime
mktime(datetime.utctimetuple(datetime.strptime("20110830_1117","%Y%m%d_%H%M")))
Voici une solution stdlib (pas de modules tiers) qui fonctionne à la fois sur Python 2 et 3.
Pour obtenir l'heure UTC actuelle au format RFC 2822:
>>> from email.utils import formatdate
>>> formatdate(usegmt=True)
'Fri, 27 Mar 2015 08:29:20 GMT'
Pour obtenir l'heure UTC 5 minutes dans le futur:
#!/usr/bin/env python
import time
from email.utils import formatdate
print(formatdate(time.time() + 300, usegmt=True)) # 5 minutes into the future
# -> Fri, 27 Mar 2015 08:34:20 GMT
Solution avec fantastique Delorean lib:
>>> import datetime
>>> import delorean
>>> dt = datetime.datetime.now()
>>> dl = delorean.Delorean(dt, timezone='US/Pacific')
>>> dl.shift('UTC')
Delorean(datetime=2015-03-27 03:12:42.674591+00:00, timezone=UTC)
>>> dl.shift('UTC').datetime
datetime.datetime(2015, 3, 27, 3, 12, 42, 674591, tzinfo=<UTC>)
>>> dl.shift('EST').datetime
datetime.datetime(2015, 3, 26, 22, 12, 42, 674591, tzinfo=<StaticTzInfo 'EST'>)
Il permet de décaler facilement datetime entre différents fuseaux horaires