具有负值的Python timedelta对象

时间:2017-10-18 05:33:10

标签: python python-datetime

我不太清楚如何解释datetime.timedelta中的否定论点。

具有正值:

>>> from datetime import timedelta
>>> d = timedelta(days=1,seconds=1,microseconds=1,milliseconds=1,minutes=1,hours=1,weeks=1)
>>> (d.days, d.seconds, d.microseconds)
>>> (8, 3661, 1001)

这非常简单。具有负值的类似示例如下所示:

>>> from datetime import timedelta
>>> d = timedelta(days=-1,seconds=-1,microseconds=-1,milliseconds=-1,minutes=-1,hours=-1,weeks=-1)
>>> (d.days, d.seconds, d.microseconds)
>>> (-9, 82738, 998999) 

根据我的理解,秒和微秒的推导如下:

  • 秒= 86399 - (-60-3600-1)
  • microseconds = 999999 - (-1-1000)

这是对的吗?为什么天等于-9?

我正在阅读文档的this部分。但仍然不太了解使用负值的工作。请分享说明或相关文档链接。谢谢:))

2 个答案:

答案 0 :(得分:2)

完全合理,(-1 week + -1 day) + (-1 hours) + (-1 minutes) + (-1 seconds) + (-1 milliseconds) + (-1 microseconds)等于:(-8 days) + (-1 hours) + (-1 minutes) + (-1 seconds) + (-1 milliseconds) + (-1 microseconds)

通过少于-8天,-1小时,-1分钟,......天数必须小于-8才能使负小时,分钟,秒......变为正数小时,分钟,秒....(因为只有几天可以被消极地表示,其他的,例如秒,总是被积极地表示)。这意味着日子必须是-9。

如果您打印d,则会获得-9 days 22:58:58.998999,负9天,正22小时以上。查看str的{​​{1}}可以帮助您更好地了解负timedelta的表示方式。

答案 1 :(得分:1)

由于时间增量是在内部存储的,因此只有days属性可以采用负值。当timedelta被打印回时,这可能会令人惊讶。 illuminating example from the docs

>>> d = timedelta(microseconds=-1)
>>> (d.days, d.seconds, d.microseconds)
(-1, 86399, 999999)

即。 -1d + 86399s + 999999µs = -1µs