2012-09-17 18 views
36

tengo las siguientes marcas de tiempo desde el periodo:Convertir sello de tiempo desde la época de datetime.datetime

Timestamp 
1346114717972 
1354087827000 

¿Cómo puedo convertir estas marcas de tiempo para algún formato de salida específico, por ejemplo, mm/dd/yyyy hr:min:sec?

me han tratado de convertirlos a datetime.datetime pero ha fallado:

>>> datetime.datetime.fromtimestamp(1346114717972) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
ValueError: timestamp out of range for platform time_t 

¿Cómo puedo hacer esto?

Respuesta

42

me gustaría utilizar el módulo time

>>> import time 
>>> time.gmtime(1346114717972/1000.) 
time.struct_time(tm_year=2012, tm_mon=8, tm_mday=28, tm_hour=0, tm_min=45, tm_sec=17, tm_wday=1, tm_yday=241, tm_isdst=0) 

la marca de tiempo se divide por 1000 como los sellos que usted ha proporcionado están en milisegundos desde la época, no segundos

a continuación, utilizar strftime para dar formato al igual entonces

>>> time.strftime('%m/%d/%Y %H:%M:%S', time.gmtime(1346114717972/1000.)) 
'08/28/2012 00:45:17' 
+0

Phew ... Estaba asumiendo segundos y calculé que era algo así como 42685 años desde la época y estaba pensando que algo tenía que estar mal allí ... – mgilson

+0

tal vez usando '1e3' en lugar de' 1000'. es mejor – zhangxaochen

25

Supongo que esta es la resolución en milisegundos:

import datetime 

s = '1346114717972' 
t = datetime.datetime.fromtimestamp(float(s)/1000.) 

fmt = "%Y-%m-%d %H:%M:%S" 
print t.strftime(fmt) 
# prints 2012-08-28 02:45:17 

La adaptación de la cadena de formato a este caso específico se deja como un ejercicio para el lector. Eche un vistazo a la documentación del strftime() and strptime() behavior.

+6

Tenga en cuenta que esta respuesta convertirá la marca de tiempo a una hora local. Si desea la fecha y hora equivalente en UTC, use datetime.datetime.utcfromtimestamp() en lugar de datetime.datetime.fromtimestamp(). – Marc

Cuestiones relacionadas