J'ai un python objet datetime 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 sais pas si cela compte pour cette question. J'ai trouvé des informations sur ce site sur la conversion des objets de temps, et cela semble plus simple de cette façon, mais cette fois, je veux vraiment utiliser des objets datetime, parce que j'utilise timedeltas pour les ajuster:
J'ai essayé quelque chose comme ça:
from datetime import datetime, timedelta
now = datetime.now()
fiveMinutesLater = datetime.now() + timedelta(minutes=5)
fiveMinutesLaterUtc = ???
Rien dans le module time ou datetime ne semble m'aider. 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.
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 se sont retrouvés ici à la recherche d'un moyen de convertir un objet datetime en secondes UTC depuis UNIX Epoch:
import time
import datetime
t = datetime.datetime.now()
utc_seconds = time.mktime(t.timetuple())
Voici une solution stdlib (pas de modules tiers) qui fonctionne sur les deux 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 plus tard:
#!/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
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")))
Vous pouvez utiliser la méthode formatdate dans le module email.Utils comme suit
>>> from email.Utils import formatdate
>>> print formatdate()
Sun, 25 Jul 2010 04:02:52 -0000
Ce qui précède est la date et l'heure au format RFC 2822. Par défaut, il renvoie l'heure UTC, mais si vous avez besoin de l'heure locale, vous pouvez appeler formatdate (localtime = True).
Pour plus d'informations, vérifiez 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 RFC 2822:
time.strftime("%a, %d-%b-%Y %H:%M:%S GMT",
time.gmtime(time.time() + datetime.timedelta(minutes=5).seconds))
Cela ne répond pas exactement à ma question, mais je le 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 sorte de valeur timedelta, vous pouvez utiliser timedelta.total_seconds()
(pour Python 2.7 et versions ultérieures), ou avec 86400*timedelta.days + timedelta.seconds
. I n'ont pas réellement essayé cela, donc je ne suis pas sûr à 100% si cela fonctionnera.
solution avec fantastiqueDelorean 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éplacer facilement le datetime entre différents fuseaux horaires