2011-08-30 98 views
2

好了,所以我通過轉換字符串日期至今:字符串變量的DateTime格式

datetime.datetime.fromtimestamp(time.mktime(time.strptime(date_string, DB_TIME_FORMAT))) 

但我發現了一些奇怪的結果。例如,對於:

date_string = '2011-08-30 12:52:57.573979' 
DB_TIME_FORMAT = '%Y-%m-%d %H:%M:%S.%f' 

結果是:

2011-08-30 12:52:57 

所以我想我的第一個問題是在哪裏毫秒去了?

我的第二個問題是有沒有辦法做一個「動力」字符串時間轉換?我的意思是,讓我們說在我前面的例子中的格式,如果毫秒不存在,而不是讓一個ValueError如果仍然將回到正常的日期。如果秒鐘缺少相同的情況等?

問候, 波格丹

+0

我想這可能與mktime丟失,因爲1/1/1970應該在幾秒鐘內返回Unix時間戳。事實上,timetimeamp預計會有那種時間戳。 – Teudimundo

+0

'.573979' - 看起來像微秒,毫秒不。 – eumiro

回答

2

你缺少毫秒,因爲strptime返回time tuple,它沒有毫秒字段,並存儲秒爲整數。從那時起,你的結果就會缺失毫秒。正確的方法來獲得毫秒是使用datetime模塊的strptime,像這樣:

parsed = datetime.datetime.strptime(date_string, DB_TIME_FORMAT) 

這也簡化了您的解決方案,因爲它看起來像你想反正有日期時間結束了。

至於在接受的格式被放鬆,這是不容易在Python;它的日期/時間模塊沒有「自動檢測」某些語言的方式。在沒有使用第三方庫的情況下,我認爲你最好是捕捉異常並以不同格式重試。例如:

from datetime import datetime 
try: parsed = datetime.strptime(date_string, DB_TIME_FORMAT) 
except ValueError: 
    parsed = datetime.strptime(date_string, DB_TIME_FORMAT_WITHOUT_MILLISECONDS) 

而且您可以爲缺少的秒等添加額外的級別。

+0

謝謝,真的不記得爲什麼我想在首位的時間戳。 – Bogdan