【问题标题】:Python timedelta object with negative values具有负值的 Python timedelta 对象
【发布时间】:2018-03-29 22:16:13
【问题描述】:

我不太明白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)
  • 微秒 = 999999 - (-1-1000)

这是正确的吗?为什么天数等于-9?

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

【问题讨论】:

  • 如果您使用命名参数 btw...
  • 同意并编辑

标签: python python-datetime


【解决方案1】:

由于 timedelta 的内部存储方式,只有 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

【讨论】:

  • datetime 包的设计太糟糕了..
【解决方案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 小时以上。查看timedeltastr 可以帮助您更好地了解负面timedelta 的表示方式。

【讨论】:

  • 结果天数为-8,但由于小时数、分钟数、秒数为负数...天数变为-9。因此,如果小时数为负数,则每次天数减 1,分钟数秒?如果某些参数不是负数怎么办?
  • 假设时间增量在一个增量为一天的数字线上,如果天数本身为负 -8,并且小数仍然为负数,则天数将反弹到下一个左侧整数,因为只有天可以是负数。如果天数为 -8,而其他天数(不包括周数)或其他天数的总和为正数,则天数将保持为 -8。 timedelta(days=-1, seconds=1, weeks=-1) 天数将保持为 -8,因为有一个正秒,timedelta(days=-1, minutes=1, seconds=-1, weeks=-1) 天数仍然是 -8,因为 1 分钟和 -1 秒的总和是正 59 分钟
  • 啊对!我现在明白了。谢谢你的解释。
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 2012-04-18
相关资源
最近更新 更多