理解timedelta

93

以下是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 timeend time之间的差异,在第5行我通过类型转换将持续时间向上取整,但现在需要进一步解释吗?

我知道 delta 的意思(平均值或差异),但为什么我必须传递 seconds = uptimetimedelta,为什么字符串转换可以如此完美地得到 HH:MM:SS

2个回答

117

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

对于字符串转换,它返回一个漂亮的格式化值,而不是使用__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

这是关于Python中时间差对象的文档,请点击链接查看。

13
为什么我需要传递“秒数”给 timedelta 函数?
因为 timedelta 函数可以接收以秒、毫秒、天等为单位的参数,所以你需要明确指定你所传递的是什么(这就是使用显式键的原因)。将其转换为 int 类型是多余的,因为它们也可以接受浮点数。
还有,为什么字符串转换如此优秀,以至于我得到了 HH:MM:SS 格式?
这不是类型转换的作用,而是对象内部的 "__str__" 方法进行格式化。实际上,如果你这样写,也能得到相同的结果:
print(datetime.timedelta(seconds=int(uptime)))

1
你提到了这一点,但值得明确指出的是timedelta不仅仅可以以HH:MM:SS格式显示时间。当你需要计算两个datetime对象之间的差异时,就会使用timedelta对象。 - Wilduck
1
不是__repr__方法,而是__str__方法。 - utdemir
1
不是timedelta的__repr__(),而是它的__str__()方法。print会为您调用__str()__ - bgporter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接