2010-01-22 73 views
124

我有一個timedelta。我想要那些日子,小時和分鐘 - 無論是作爲一個元組還是一本字典...我都沒有被激怒。將timedelta轉換爲天,小時和分鐘

多年來,我一定在十幾種語言中完成了十幾次這樣的工作,但Python通常對所有事情都有一個簡單的答案,所以我想在這裏先解決一些令人討厭的簡單(但冗長)的數學問題。

Fooz先生提出了一個很好的觀點。

我正在處理「列表」(有點像易趣列表),其中每個有一個持續時間。我試圖找到剩下的時間when_added + duration - now

我說得對,不會考慮DST嗎?如果不是,增加/減少一小時最簡單的方法是什麼?

回答

176

如果你有一個datetime.timedeltatdtd.days已經爲您提供了「天時」你想要的。 timedelta值保持幾分之日爲秒(不直接幾小時或幾分鐘),所以你確實得執行「肉麻簡單的數學」,例如:

def days_hours_minutes(td): 
    return td.days, td.seconds//3600, (td.seconds//60)%60 
2

timedeltas有daysseconds屬性..你可以輕鬆地自己轉換它們。

17
days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60 

至於DST,我認爲最好的辦法是兩個datetime對象轉換爲秒。這樣系統會爲您計算DST。

>>> m13 = datetime(2010, 3, 13, 8, 0, 0) # 2010 March 13 8:00 AM 
>>> m14 = datetime(2010, 3, 14, 8, 0, 0) # DST starts on this day, in my time zone 
>>> mktime(m14.timetuple()) - mktime(m13.timetuple())  # difference in seconds 
82800.0 
>>> _/3600            # convert to hours 
23.0 
+1

'mktime()如果當地時區可能有不同的UTC在不同的時間偏移'可能會失敗(很多人) - 你可以使用'pytz'模塊獲得在便攜式deteministic訪問時區信息數據庫辦法。此外,本地時間可能不明確(錯誤發生機率爲50%) - 您需要一些附加信息來消除歧義,例如,經常(並非總是)[日誌文件中的日期單調](http://stackoverflow.com/a /4279分之26221183)。請參閱[我如何從python日期減去一天?](http://stackoverflow.com/q/441147/4279),可能需要處理類似的問題。 – jfs 2015-05-09 10:34:07

4

我不明白

days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60 

這個怎麼樣

days, hours, minutes = td.days, td.seconds // 3600, td.seconds % 3600/60.0 

你得到一分鐘的單精度浮點分鐘和​​秒。

53

這是一個更緊湊,你得到兩個小時,分鐘和秒。

days = td.days 
hours, remainder = divmod(td.seconds, 3600) 
minutes, seconds = divmod(remainder, 60) 
# If you want to take into account fractions of a second 
seconds += td.microseconds/1e6 
+5

如果td.days不爲零,則不正確。你需要'小時+ = td.days * 24'。如果你想考慮秒的分數(OP沒有);可以使用'seconds + = td.microseconds/1e6'。 – jfs 2015-05-09 10:26:45

相關問題