首页 > 解决方案 > Python timedelta更新是随机减去2天

问题描述

我的程序有 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.

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

我已经尝试调试它并添加 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

标签: pythondatetimetimedeltapytz

解决方案


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

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

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


推荐阅读