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.

39
demandé sur Elias Zamaria 2010-07-25 07:59:08

8 réponses

from datetime import datetime, timedelta
datetime.utcnow() + timedelta(minutes=5)
27
répondu Senyai 2012-11-29 10:55:26

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

9
répondu Amber 2010-07-25 04:05:10

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())
6
répondu ishmael 2011-08-15 19:21:53

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

2
répondu GeekTantra 2010-07-25 04:04:20

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.

2
répondu Elias Zamaria 2010-07-27 19:03:51

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")))
2
répondu ElaineN 2011-11-08 22:59:19

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
2
répondu jfs 2015-03-27 08:31:10

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

1
répondu DmitrySemenov 2015-03-27 03:15:54