理解timedelta

93 投票
2 回答
217503 浏览
提问于 2025-04-16 21:51

给定下面的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

撰写回答