2011-05-10 13 views
15

Estoy trabajando con un código que me da las marcas de hora utc y quiero convertirlas a las fechas apropiadas. Lamentablemente, cuando pruebo casos simples con pytz, la fecha y hora tiene un agregado de 6 horas (el desplazamiento de CST a UTC). Necesito mantener los datos de zona horaria correctos porque también estoy calculando la diferencia entre otras zonas horarias. ¿Alguna idea de por qué y cómo convertir una indicación de fecha y hora utc a una fecha y hora utc?Convirtiendo python datetime a timestamp y de regreso en UTC todavía usa la zona horaria local

In [1]: import pytz 

In [2]: from datetime import datetime 

In [3]: import time 

In [4]: datetime.fromtimestamp(time.mktime(datetime(7,1,1, tzinfo=pytz.UTC).timetuple()), tz=pytz.UTC) 
Out[4]: datetime.datetime(2007, 1, 1, 6, 0, tzinfo=<UTC>) 

In [5]: datetime.fromtimestamp(time.mktime(datetime(7,1,1).utctimetuple()), tz=pytz.UTC) 
Out[5]: datetime.datetime(2007, 1, 1, 6, 0, tzinfo=<UTC>) 

In [6]: datetime.fromtimestamp(time.mktime(datetime(7,1,1).utctimetuple())) 
Out[6]: datetime.datetime(2007, 1, 1, 0, 0) 
+0

relacionado: [¿Cómo puedo obtener una fecha convertida en segundos desde la época de acuerdo a UTC ?] (http://stackoverflow.com/a/8778548/4279) – jfs

Respuesta

1

¿Estaría usted en la zona horaria CST de EE. UU. O equivalente?

Parece que muestra qué hora era en UTC cuando su hora local era la medianoche del 1/1/2007.

+0

Sí, estoy en CST de EE. UU. Supongo que me gustaría saber cuál es la forma correcta de llamar a esto para obtener una fecha UTC, pensé que tzinfo establecería la zona horaria correctamente. – aterrel

+0

Esto es de la documentación de pytz: >>> datetime (2002, 10, 27, 12, 0, 0, tzinfo = pytz.utc) .strftime (fmt) '2002-10-27 12:00:00 UTC + 0000 ' – Olaf

+0

Olaf gracias por su respuesta, pero este no es exactamente el problema. El tiempo de ejecución funciona bien en el objeto datetime. Lo que no funciona es convertirlo en una marca de tiempo y obtener ese mismo utc de la marca de tiempo. – aterrel

41

para obtener un objeto de fecha y hora ingenua que representa el tiempo en UTC de "segundos desde la época" marca de tiempo:

from datetime import datetime 

utc_dt = datetime.utcfromtimestamp(ts) 

Si desea consiga un objeto datetime enterado para la zona horaria UTC:

import pytz 

aware_utc_dt = utc_dt.replace(tzinfo=pytz.utc) 

Convertir la t o alguna otra zona horaria:

tz = pytz.timezone('America/Montreal') 
dt = aware_utc_dt.astimezone(tz) 

Para convertir una marca de tiempo a un objeto de fecha y hora al tanto en la zona horaria dada directamente:

dt = datetime.fromtimestamp(ts, tz) 
Cuestiones relacionadas