Answers:
如果您有一个datetime.timedelta
值td
,那么td.days
已经为您提供了所需的“天数”。timedelta
值将天的分数保持为秒(而不是小时或分钟),因此您确实必须执行“令人作呕的简单数学”,例如:
def days_hours_minutes(td):
return td.days, td.seconds//3600, (td.seconds//60)%60
td
为负,-1 // 3600
则为-1
。
jcrs
指出@EerikSvenPuudist -1//3600
是-1
,那么为什么不使用int(td.seconds/3600)
而是将-1
秒变成0
小时而不是1
倒数小时呢?
days, hours, minutes = x.days, x.seconds // 3600, x.seconds %3600//60
然后 seconds = x.seconds - hours*3600 - minutes*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
td.days
非零,则不正确。你需要hours += td.days*24
。如果要考虑几分之一秒(OP不需要);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
mktime()
如果本地时区在不同时间可能具有不同的utc偏移量,则可能会失败(很多这样做)-您可以使用pytz
模块以可确定的方式访问tz数据库。同样,本地时间可能是模棱两可的(50%的错误机会)-您需要一些其他信息来消除歧义,例如,日志文件中的日期经常(并非总是)单调。请参阅如何从python日期中减去一天?可能必须处理类似的问题。
我使用了以下内容:
delta = timedelta()
totalMinute, second = divmod(delta.seconds, 60)
hour, minute = divmod(totalMinute, 60)
print(f"{hour}h{minute:02}m{second:02}s")
timedeltas具有days
and seconds
属性..您可以轻松地自己转换它们。
timedelta