91

鉴于下面的 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)))

start time所以我得到了和之间的区别end time,在第 5 行,我通过强制转换来四舍五入持续时间,现在,进一步的解释是什么?

我知道 delta 是什么意思(平均值或差异),但为什么我必须传递seconds = uptimetimedelta,为什么字符串转换工作得这么好,以至于我得到了HH:MM:SS

4

2 回答 2

116

因为 timedelta 的定义如下:

class datetime.timedelta([days,] [seconds,] [microseconds,] [milliseconds,] [minutes,] [hours,] [weeks])

所有参数都是可选的,默认为 0。

您可以通过这种方式轻松说出“三天零四毫秒”的可选参数。

>>> 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)

对于 str 强制转换,它返回一个很好的格式化值,而不是__repr__提高可读性。来自文档:

str(t) 返回格式为 [D day[s], ][H]H:MM:SS[.UUUUUU] 的字符串,其中 D 为负,表示负 t。(5)

>>> 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

于 2011-07-19T15:09:06.223 回答
13

为什么我必须将秒 = 正常运行时间传递给 timedelta

因为 timedelta 对象可以传递秒、毫秒、天等......所以你需要指定你在传递什么(这就是你使用显式键的原因)。类型转换到int是多余的,因为它们也可以接受浮点数。

为什么字符串转换效果很好以至于我得到 ​​HH:MM:SS ?

格式化的不是类型转换,而是__str__对象的内部方法。实际上,如果您编写以下代码,您将获得相同的结果:

print(datetime.timedelta(seconds=int(uptime)))
于 2011-07-19T15:07:18.797 回答