了解时间增量


90

给定下面的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 = uptime给delta timedelta以及为什么字符串转换效果如此之好以至于我得到了HH:MM:SS

Answers:


114

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


13

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

由于timedelta对象可以传递秒,毫秒,天等信息,因此您需要指定传递的内容(这就是使用显式键的原因)。类型转换int为多余,因为它们也可以接受浮点数。

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

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

print datetime.timedelta(seconds=int(uptime))

1
您暗示了这一点,但值得注意的是,timedelta除了以HH:MM:SS格式显示内容以外,还可以做很多其他事情。每当需要在两个日期时间对象之间进行区别时,都会使用一个timedelta对象。
野鸭

1
不是__repr__方法,而是__str__方法。
utdemir

1
不是__repr__()timedelta的,而是它的__str__()方法。print呼唤__str()__你。
bgporter 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.