2012-09-17 9 views
36

ho le seguenti timestamp dal epoca:Converti timestamp dal periodo di datetime.datetime

Timestamp 
1346114717972 
1354087827000 

Come posso convertire questi timestamp ad alcune formato di output specifico, per esempio, mm/dd/yyyy hr:min:sec?

ho cercato di convertirli in datetime.datetime ma non è riuscito:

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

Come posso fare questo?

risposta

42

Vorrei utilizzare il modulo di 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) 

il timestamp viene diviso per 1000 come i francobolli che avete fornito sono in millisecondi dal l'epoca, non secondi

quindi utilizzare strftime per formattare come so

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

Phew ... stavo assumendo secondi così e ho calcolato che era qualcosa come 42685 anni dall'epoca e stavo pensando che qualcosa doveva essere sbagliato lì ... – mgilson

+0

magari usando '1e3' invece di' 1000'. è meglio – zhangxaochen

25

Presumo che sia la risoluzione in millisecondi:

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 

L'adattamento della stringa di formato a questo caso specifico viene lasciato come esercizio per il lettore. Dai un'occhiata alla documentazione per strftime() and strptime() behavior.

+6

Si noti che questa risposta convertirà il timestamp in un datetime locale. Se si desidera che il tempo di utilizzo equivalente in UTC utilizzi datetime.datetime.utcfromtimestamp() anziché datetime.datetime.fromtimestamp(). – Marc

Problemi correlati