2012-09-17 39 views
36

因爲我有劃時代以下時間戳:轉換時間戳紀元以來以datetime.datetime

Timestamp 
1346114717972 
1354087827000 

我怎麼能這些時間戳轉換爲一些特定的輸出格式,例如,mm/dd/yyyy hr:min:sec

我試圖將它們轉換爲datetime.datetime但它失敗:

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

我怎樣才能做到這一點?

回答

42

我會用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) 

時間戳除以1000爲您提供的郵票是因爲時代毫秒,不秒

然後使用strftime像格式化所以

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

Phew ...我假設秒,所以我計算,這是類似於自歷史42685年以來,我一直在想,有什麼必須在那裏出錯... – mgilson

+0

也許使用'1e3'而不是'1000.'更好 – zhangxaochen

25

我假設這是毫秒分辨率:

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 

調整格式字符串到這個特定的情況是作爲excercise留給讀者。 查看strftime() and strptime() behavior的文檔。

+6

請注意,此答案會將時間戳轉換爲本地日期時間。如果您希望UTC中的等效日期時間使用datetime.datetime.utcfromtimestamp()而不是datetime.datetime.fromtimestamp()。 – Marc