2010-07-25 17 views
39

Tengo un objeto python datetime que me gustaría convertir a UTC. Estoy planeando enviarlo en formato RFC 2822 para poner un encabezado HTTP, pero no estoy seguro de si eso es importante para esta pregunta. Encontré algo de información en este sitio sobre la conversión de objetos de tiempo, y parece más simple de esa manera, pero esta vez realmente quiero usar objetos datetime, porque estoy usando timedeltas para ajustarlos:¿Cómo puedo convertir un objeto de fecha y hora de Python a UTC?

Intenté algo como esto:

from datetime import datetime, timedelta 

now = datetime.now() 
fiveMinutesLater = datetime.now() + timedelta(minutes=5) 
fiveMinutesLaterUtc = ??? 

Nada en el módulo de hora o fecha parece que me ayudaría. Parece que puedo hacerlo pasando el objeto datetime a través de 3 o 4 funciones, pero me pregunto si hay una manera más simple.

Preferiría no utilizar módulos de terceros, pero puedo hacerlo si es la única opción razonable.

+0

relacionado con el título: [¿Cómo convierto la hora local en UTC en Python?] (Http://stackoverflow.com/q/79797/4279) – jfs

+0

cadena: http://stackoverflow.com/questions/79797/how-do-i-convert-local-time-to-utc-in-python –

Respuesta

28
from datetime import datetime, timedelta 
datetime.utcnow() + timedelta(minutes=5) 
2

Usted puede utilizar el método formatDate en el módulo email.Utils como sigue

>>> from email.Utils import formatdate 
>>> print formatdate() 
Sun, 25 Jul 2010 04:02:52 -0000 

Lo anterior es de fecha y hora en formato RFC 2822. Por defecto, devuelve la hora UTC pero, en caso de que necesite la hora local, puede llamar a la fecha de formateo (localtime = True).

Para obtener más información se echa un http://docs.python.org/library/email.mime.html#module-email.util

+1

no funcionará en Python 3; usted podría [usar 'email.utils' (lowecase) en su lugar] (http://stackoverflow.com/a/29296267/4279) – jfs

9

primero que necesita para asegurarse de que la fecha y hora es un objeto de zona horaria consciente estableciendo su tzinfo miembro de:

http://docs.python.org/library/datetime.html#datetime.tzinfo

continuación, puede utilizar la función .astimezone() para convertirlo:

http://docs.python.org/library/datetime.html#datetime.datetime.astimezone

+1

De acuerdo con los documentos, necesito encontrar una subclase de la clase tzinfo para que aparezca con un objeto que puedo pasar a la función "ahora" para que esté al tanto de la zona horaria de mi servidor. Eso parece un poco complicado. ¿Alguien sabe de una manera más simple? Si encuentro una forma más simple, la publicaré aquí. –

+7

@ mikez302 - Mira en el módulo de pytz. En realidad, es una base de datos de definiciones de zona horaria datetime.tzinfo para todas las zonas horarias comunes. –

+0

@EliasZamaria: para obtener la zona horaria local como objeto 'pytz' tzinfo, puede [use' tzlocal.get_localzone() '] (http://stackoverflow.com/q/13218506/4279) – jfs

2

He encontrado una manera de tomar la hora actual, añadir un objeto timedelta a ella, convertir el resultado a UTC, y la saca en el RFC 2822:

time.strftime("%a, %d-%b-%Y %H:%M:%S GMT", 
    time.gmtime(time.time() + datetime.timedelta(minutes=5).seconds)) 

esto no ha respondido exactamente mi pregunta, pero estoy poniéndolo aquí porque puede ayudar a alguien más en mi situación.

EDIT: Me gustaría añadir que este truco solo funciona si el timedelta es de menos de un día. Si desea algo que funcione con cualquier tipo de valor timedelta, puede usar timedelta.total_seconds() (para Python 2.7 y posterior) o con 86400*timedelta.days + timedelta.seconds. No he probado esto, así que no estoy 100% seguro de si funcionará.

+0

nota:'% b' puede ser dependiente del lugar [Use email.utils.formatdate en su lugar] (http://stackoverflow.com/a/29296267/4279). No relacionado: '86400 * timedelta.days + timedelta.seconds' siempre funciona si necesita admitir Python 2.6+ y no le importan los microsegundos. – jfs

6

Para aquellos que terminó aquí en busca de una forma de convertir un objeto de fecha y hora al segundo UTC desde UNIX época:

import time 
import datetime 

t = datetime.datetime.now() 
utc_seconds = time.mktime(t.timetuple()) 
+4

Eso no es exacto, desde mktime doc: Convierta una tupla de tiempo en tiempo local a segundos desde la Época. –

+1

esta no es la respuesta a la pregunta que hizo el OP. :( – sneak

+0

nota: el tiempo local puede ser ambiguo (por ejemplo, durante una transición DST de "repliegue") y hay un 50% de que 'mktime()' puede devolver un valor incorrecto. También falla si la zona horaria local tenía/tendrá un diferente utc offset en el pasado/futuro (muchas zonas horarias) * y * C 'mktime()' no usa la base de datos tz (por ejemplo, en Windows). La solución portátil para convertir un objeto datetime ingenuo que representa la hora local a UTC es a [use 'tzlocal.get_localzone()' para obtener la zona horaria local como objeto 'pytz' tzinfo] (http://stackoverflow.com/q/13218506/4279) – jfs

2

Convertir en UTC de una cadena de fecha:

from time import mktime 
from datetime import datetime 

mktime(datetime.utctimetuple(datetime.strptime("20110830_1117","%Y%m%d_%H%M"))) 
+1

Esto no funcionará --- mktime usa la zona horaria local . Ver http://stackoverflow.com/questions/2956886/python-calendar-timegm-vs-time-mktime – teu

1

solución con fantásticoDelorean 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'>) 

Permite cambiar de fecha y hora entre diferentes zonas horarias fácilmente

+1

No me fiaría demasiado, dado que el autor de '' delorean' no entiende la diferencia entre '.now()' y '.now (tz)'] (https://github.com/myusuf3/delorean/pull/46). – jfs

0

Aquí hay una solución stdlib (no hay módulos de 3 ª parte) que funciona tanto en Python 2 y 3.

Para obtener la hora UTC actual en RFC 2822 formato:

>>> from email.utils import formatdate 
>>> formatdate(usegmt=True) 
'Fri, 27 Mar 2015 08:29:20 GMT' 

para obtener la hora UTC 5 minutos en el futuro:

#!/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 
Cuestiones relacionadas