2011-07-19 53 views
55

鑑於下面的python代碼,請幫我理解那裏發生了什麼。瞭解timedelta

start_time = time.time() 
time.sleep(42) 
end_time = time.time() 

uptime = end_time - start_time 

human_uptime = str(datetime.timedelta(seconds=int(uptime))) 

所以我得到start timeend time之間的區別,第5行我鑄造圍捕的持續時間和現在是怎樣,有什麼進一步的解釋?

我知道什麼三角洲手段(平均或差),但爲什麼我要傳遞給seconds = uptimetimedelta爲什麼字符串鑄造工作得這麼好,我得到HH:MM:SS

回答

74

因爲timedelta就像定義:

class datetime.timedelta([days,] [seconds,] [microseconds,] [milliseconds,] [minutes,] [hours,] [weeks]) 

All arguments are optional and default to 0. 

您可以輕鬆地說:「三天四毫秒」與可選參數的方式。

>>> datetime.timedelta(days=3, milliseconds=4) 
datetime.timedelta(3, 0, 4000) 
>>> datetime.timedelta(3, 0, 0, 4) #no need for that. 
datetime.timedelta(3, 0, 4000) 

而對於str轉換,它將返回一個很好的格式化值而不是__repr__。爲了提高可讀性。從文檔:

STR(噸)返回一個字符串的形式[d天[s]時,] [H] H:MM:SS [.UUUUUU], 其中d是負負噸。 (5)

>>> datetime.timedelta(seconds = 42).__repr__() 
'datetime.timedelta(0, 42)' 
>>> datetime.timedelta(seconds = 42).__str__() 
'0:00:42' 

結帳文檔:

http://docs.python.org/library/datetime.html#timedelta-objects

10

爲什麼我要傳遞秒=正常運行時間timedelta

因爲timedelta對象可以通過秒,毫秒,天,等...所以你需要指定你這是在傳遞(這就是你使用顯式鍵的原因)。輸入int是多餘的,因爲他們也可以接受浮游物。

爲什麼字符串鑄造工作得很好,我得到HH:MM:SS?

這不是格式化類型,而是對象的內部方法__str__。事實上,如果你寫的,你會得到相同的結果:

print datetime.timedelta(seconds=int(uptime)) 
+1

你暗示了這一點,但它是值得明確指出的是,timedelta確實比HH顯示的東西多了不少:MM:SS格式。每當需要在兩個日期時間對象之間進行區分時,都會使用timedelta對象。 – Wilduck

+1

它不是'__repr__'方法,它是'__str__'方法。 – utdemir

+1

不是'__repr __()'timedelta,而是'__str __()'方法。 'print'爲你調用'__str()__'。 – bgporter