【问题标题】:Python timedelta update is randomly subtracting 2 daysPython timedelta更新是随机减去2天
【发布时间】:2020-08-22 11:47:04
【问题描述】:

我的程序有 2 个 datetime 对象,一个存在,另一个是 updated_at,它通过 api 获取。目标很简单,比较它们并显示它是多久以前更新的。

from datetime import datetime
from datetime import timedelta
import pytz

frontier_tz = pytz.timezone('UTC')
frontier_time = datetime.now(frontier_tz)

...
updated_at = '2020-05-07T07:16:39.000Z' # this value is provided by an api
updated_at = frontier_tz.localize(datetime.strptime(updated_at[0:16], '%Y-%m-%dT%H:%M'))
# since it's a string, it has to be converted into a datetime object
updated_ago = frontier_time - updated_at
updated_ago_text = str(updated_ago).split(':')[0]
# the result is something like "1 day, 2", then I add surrounding text

最后一段代码每 30 分钟循环一次更新结果文本,它从 api 获取新数据并比较当前时间和updated_at

问题是:随机它会从updated_ago 中减去 2 天,并在大多数情况下变为负数,因为大多数对象每天都在更新。

我已经尝试调试它并添加 2 天以防结果是否定的:

if updated_ago < timedelta(seconds=0):
    print('ALERT!', updated_ago)
    updated_ago += timedelta(days=2)
    print(updated_ago)
    updated_ago += timedelta(days=-2)

结果更令人沮丧。我花了几天的时间进行测试(因为这个错误是随机出现的)。例如,假设updated_ago 是“1 小时”。当添加 2 天时,updated_ago 突然解除错误,将 2 天添加到正确的值并变为“2 天,1 小时”,如果再次减去 2 天,它会从正确的值中减去它们“ 1 小时”变成“-2 天 23 小时”。

这是此错误的最新实例的打印输出:

ALERT! -1 day, 23:54:04.378389
1 day, 23:54:04.378389

【问题讨论】:

  • 请提供清楚显示问题的示例数据 - 了解如何创建minimal reproducible example
  • @ThierryLathuille 添加了变量。如果需要,我也可以提供中间值。
  • 因为我们无权访问 API:您确定这些时间戳有效吗?一般来说,如果它会在几秒内为您提供一个 posix 时间戳(以防万一),会更容易。
  • 另外,如果您将字符串“2020-05-07T07:16:39.000Z”解析为datetime.strptime(updated_at, '%Y-%m-%dT%H:%M:%S.%f%z'),则它已经被本地化了
  • @MrFuppes 是的,我检查了来自 API 的数据,它是有效的。这实际上是我检查的第一件事。而且,不幸的是,这种解释不起作用。

标签: python datetime timedelta pytz


【解决方案1】:

尽管这个错误很奇怪,但解决方案更奇怪。适用于我的情况,因为结果值极不可能高于 24 小时,但在其他情况下可能不起作用:

if updated_ago < timedelta(seconds=0):
    updated_ago += timedelta(days=1)
    updated_ago = timedelta(days=1) - updated_ago

我已经尝试了许多不同的变体,这些变体比这个更有意义(有时甚至更少),但这个似乎可以完成这项工作。 如果其他人偶然发现了此类错误,请发表评论,因为这似乎是 python datetime 库错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多