我的脚本计算了 2 次的差异。像这样:
lasted = datetime.strptime(previous_time, FMT) - datetime.strptime(current_time, FMT)
它返回给我一个 timedelta 对象。目前,它给了我几秒钟的差异。
我怎样才能格式化它以很好地显示?
例如将“121”转换为“00:02:01”?
谢谢你。
我的脚本计算了 2 次的差异。像这样:
lasted = datetime.strptime(previous_time, FMT) - datetime.strptime(current_time, FMT)
它返回给我一个 timedelta 对象。目前,它给了我几秒钟的差异。
我怎样才能格式化它以很好地显示?
例如将“121”转换为“00:02:01”?
谢谢你。
你试过使用str()
吗?
>>> a = datetime.now()
>>> b = datetime.now() - a
>>> b
datetime.timedelta(0, 6, 793600)
>>> str(b)
'0:00:06.793600'
或者,您可以使用字符串格式:
>>> a = datetime.now()
>>> b = datetime.now() - a
>>> s = b.total_seconds()
>>> '{:02}:{:02}:{:02}'.format(s // 3600, s % 3600 // 60, s % 60)
'00:00:06'
您可以str
通过创建新的 timedelta 对象来截断使用时的秒数
>>> a = datetime.now()
>>> b = datetime.now()
>>> c = b-a
>>> str(c)
'0:00:10.327705'
>>> str(timedelta(seconds=c.seconds))
'0:00:10'
[在这里插入无耻的自我宣传免责声明]
您可以使用https://github.com/frnhr/django_timedeltatemplatefilter
它被打包为 Django 的模板过滤器,所以这是重要的部分,只是普通的 Python:
def format_timedelta(value, time_format="{days} days, {hours2}:{minutes2}:{seconds2}"):
if hasattr(value, 'seconds'):
seconds = value.seconds + value.days * 24 * 3600
else:
seconds = int(value)
seconds_total = seconds
minutes = int(floor(seconds / 60))
minutes_total = minutes
seconds -= minutes * 60
hours = int(floor(minutes / 60))
hours_total = hours
minutes -= hours * 60
days = int(floor(hours / 24))
days_total = days
hours -= days * 24
years = int(floor(days / 365))
years_total = years
days -= years * 365
return time_format.format(**{
'seconds': seconds,
'seconds2': str(seconds).zfill(2),
'minutes': minutes,
'minutes2': str(minutes).zfill(2),
'hours': hours,
'hours2': str(hours).zfill(2),
'days': days,
'years': years,
'seconds_total': seconds_total,
'minutes_total': minutes_total,
'hours_total': hours_total,
'days_total': days_total,
'years_total': years_total,
})
没有比这更简单的了:)不过,请查看自述文件以获取一些示例。
对于您的示例:
>>> format_timedelta(lasted, '{hours_total}:{minutes2}:{seconds2}')
0:02:01
该小数秒位有时在时间增量中是不需要的。通过拆分和丢弃快速截断该小数位:
a = datetime.now()
b = datetime.now() - a
然后
str(b).split('.')[0]
(假设几分之一秒与您无关的应用程序)
希望这能解决您的问题,
import datetime
start = datetime.datetime(2012,11,16,11,02,59)
end = datetime.datetime(2012,11,20,16,22,53)
delta = end-start
print ':'.join(str(delta).split(':')[:3])
In [29]: import datetime
In [30]: start = datetime.datetime(2012,11,16,11,02,59)
In [31]: end = datetime.datetime(2012,11,20,16,22,53)
In [32]: delta = end-start
In [33]: print ':'.join(str(delta).split(':')[:3])
4 days, 5:19:54
扩展@blender的答案。如果您对毫秒分辨率感兴趣
a = datetime.now()
b = datetime.now() - a
s = b.seconds
ms = int(b.microseconds / 1000)
'{:02}:{:02}:{:02}.{:03}'.format(s // 3600, s % 3600 // 60, s % 60, ms)