将timedelta转换为天,小时和分钟

我有一个timedelta。 我想要的是那些日子,时间和分钟 – 无论是作为一个元组还是一本字典…我都没有被诅咒。

这么多年来,我必须用十几种语言来完成这个工作,但是Python通常对所有事情都有一个简单的答案,所以我想在这里先讨论一些令人讨厌的简单(但是冗长)的math问题。

Fooz先生提出了一个很好的观点。

我正在处理“列表”(有点像易趣列表),每个人都有一个持续时间。 我正在尝试通过执行when_added + duration - nowfind剩下的when_added + duration - now

我是否正确地说,不会考虑DST? 如果不是,加/减一小时最简单的方法是什么?

如果你有一个datetime.timedeltatdtd.days已经给你你想要的“天”。 timedelta值将timedelta保留为秒(而不是直接的小时或分钟),所以你确实必须执行“恶化简单的math”,例如:

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

这是一个更紧凑,你得到两个小时,分钟和秒。

 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 
 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 

我不明白

 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 

作为一个浮点数,你得到一分钟和几秒钟的时间。

timedeltas有一个days seconds属性..你可以轻松地转换他们自己。