将时间差转换为天、小时和分钟

379 投票
14 回答
653313 浏览
提问于 2025-04-15 18:21

我有一个时间差(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

撰写回答