【问题标题】:Understanding timedelta了解时间增量
【发布时间】:2011-07-19 14:59:05
【问题描述】:

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

【问题讨论】:

    标签: python timedelta


    【解决方案1】:

    因为 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] 的字符串, 其中,对于负 t,D 为负。 (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

    【讨论】:

      【解决方案2】:

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

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

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

      格式化的不是类型转换,而是对象的内部__str__ 方法。事实上,如果你这样写,你会得到同样的结果:

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

      【讨论】:

      • 你暗示了这一点,但值得注意的是 timedelta 不仅仅以 HH:MM:SS 格式显示内容。每当您需要在两个日期时间对象之间获取差异时,都会使用 timedelta 对象。
      • 不是__repr__方法,是__str__方法。
      • 不是timedelta的__repr__(),而是__str__()的方法。 print 为您拨打 __str()__
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多