理解timedelta
给定下面的Python代码,能帮我理解一下里面发生了什么吗?
start_time = time.time()
time.sleep(42)
end_time = time.time()
uptime = end_time - start_time
human_uptime = str(datetime.timedelta(seconds=int(uptime)))
我在第5行计算了开始时间
和结束时间
之间的差值,然后通过转换来把持续时间向上取整,接下来还有什么需要解释的吗?
我知道delta
的意思是(平均值或差值),但是为什么我需要把seconds = uptime
传给timedelta
,而且为什么字符串转换能这么顺利地让我得到HH:MM:SS
的格式呢?
2 个回答
13
为什么我必须把 seconds = uptime 传给 timedelta?
因为 timedelta 对象可以接收秒、毫秒、天等等,所以你需要明确告诉它你传的是哪种单位(这就是为什么要用明确的键)。把它转换成 int
是多余的,因为它也可以接收浮点数。
那为什么字符串转换能这么好用,能让我得到 HH:MM:SS 的格式?
其实不是类型转换在格式化,而是对象内部的 __str__
方法在起作用。实际上,如果你写下面的代码,你也能得到同样的结果:
print(datetime.timedelta(seconds=int(uptime)))
117
因为timedelta是这样定义的:
class datetime.timedelta([days,] [seconds,] [microseconds,] [milliseconds,] [minutes,] [hours,] [weeks])
所有的参数都是可选的,默认值都是0。
这样你就可以很简单地说“3天4毫秒”,只需要用到可选参数。
>>> datetime.timedelta(days=3, milliseconds=4)
datetime.timedelta(3, 0, 4000)
>>> datetime.timedelta(3, 0, 0, 4) #no need for that.
datetime.timedelta(3, 0, 4000)
而在转换成字符串时,它会返回一个格式很好看的值,而不是__repr__
,这样更容易阅读。从文档中可以看到:
str(t) 返回一个字符串,格式为[D天[s], ][H]H:MM:SS[.UUUUUU],其中D在t为负时是负数。
>>> datetime.timedelta(seconds = 42).__repr__()
'datetime.timedelta(0, 42)'
>>> datetime.timedelta(seconds = 42).__str__()
'0:00:42'
查看文档:
http://docs.python.org/library/datetime.html#timedelta-objects