将时间量转换为天,小时和分钟


242

我有一个timedelta。我想要从中得到的天,小时和分钟-作为元组或字典...我不大惊小怪。

多年来,我肯定已经用十几种语言完成了十二次,但是Python通常对所有问题都有一个简单的答案,所以我想我会在这里提出一些令人讨厌的简单(但冗长)的数学之前先问一下。

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

我正在处理“列表”(有点像ebay列表),每个列表都有持续时间。我试图通过做找到剩余的时间when_added + duration - now

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


如果只是将其作为HH:mm:ss格式的字符串来获取,请从对象“ datetime.timedelta(seconds = 1177)”“ 0:19:37 :只需使用str()timedelta
Peter Mortensen

Answers:


342

如果您有一个datetime.timedeltatd,那么td.days已经为您提供了所需的“天数”。timedelta值将天的分数保持为秒(而不是小时或分钟),因此您确实必须执行“令人作呕的简单数学”,例如:

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

1
请记住,如果td为负,-1 // 3600则为-1
jcrs

4
为什么//?而不是/
Mohammed Shareef C

10
//用于代替/获取整数,而不是浮点数。//是楼层除法运算符:“除法将结果除以整数,并在数字行的左侧调整为整数”,请参见此处
Eerik Sven Puudist

1
jcrs指出@EerikSvenPuudist -1//3600-1,那么为什么不使用int(td.seconds/3600)而是将-1秒变成0小时而不是1倒数小时呢?
simpleuser

加上剩余的秒数又如何呢? days, hours, minutes = x.days, x.seconds // 3600, x.seconds %3600//60然后 seconds = x.seconds - hours*3600 - minutes*60
拉斐尔

73

这更加紧凑,您可以在两行中获得小时,分钟和秒。

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

7
如果td.days非零,则不正确。你需要hours += td.days*24。如果要考虑几分之一秒(OP不需要);seconds += td.microseconds / 1e6可用于。
jfs 2015年

30
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模块以可确定的方式访问tz数据库。同样,本地时间可能是模棱两可的(50%的错误机会)-您需要一些其他信息来消除歧义,例如,日志文件中的日期经常(并非总是)单调。请参阅如何从python日期中减去一天?可能必须处理类似的问题。
jfs 2015年

7

我不明白

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

您会得到几分钟和一分钟的秒数浮动。


0

我使用了以下内容:

delta = timedelta()
totalMinute, second = divmod(delta.seconds, 60)
hour, minute = divmod(totalMinute, 60)
print(f"{hour}h{minute:02}m{second:02}s")

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.