将时间差转换为天、小时和分钟
我有一个时间差(timedelta),我想从中提取出天数、小时和分钟,可以是元组(tuple)或者字典(dictionary),这两种我都可以接受。
这些年我在很多编程语言中做过这个事情,应该有十几次了,但Python通常都有简单的解决办法,所以我想在自己动手写一些复杂的数学计算之前先问问这里。
Mr Fooz提到的一个问题很不错。
我在处理一些“列表”(有点像eBay上的商品列表),每个列表都有一个持续时间。我想通过计算 when_added + duration - now
来找出剩余时间。
我这样说对吗?这样计算是不是没有考虑夏令时(DST)?如果没有,最简单的加减一个小时的方法是什么呢?
14 个回答
38
days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60
关于夏令时,我觉得最好的办法是把两个datetime
对象都转换成秒数。这样系统就会帮你计算夏令时了。
>>> 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
110
这个写法更简洁一些,你可以在两行里得到小时、分钟和秒。
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
521
如果你有一个 datetime.timedelta
的值叫 td
,那么 td.days
就能直接告诉你想要的“天数”。timedelta
的值会把一天的部分时间以秒的形式保存(而不是直接以小时或分钟),所以你确实需要进行一些“简单得让人头疼的数学运算”,比如:
def days_hours_minutes(td):
return td.days, td.seconds//3600, (td.seconds//60)%60