Python обновление timedelta случайным образом вычитает 2 дня - PullRequest
0 голосов
/ 07 мая 2020

В моей программе 2 datetime объекта, один присутствует, другой - updated_at, который он получает через api. Цель проста: сравнить их и показать, как долго go он обновлялся.

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

Этот последний фрагмент кода обновляет результирующий текст на al oop каждые 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

1 Ответ

0 голосов
/ 08 мая 2020

Каким бы странным ни был этот баг, решение еще более причудливое. Работает в моем случае, поскольку результирующее значение выше 24 часов крайне маловероятно, но может не работать в других случаях:

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

Я пробовал много разных вариантов, которые имеют больше (а иногда и меньше) смысла, чем этот, а этот, кажется, выполняет свою работу. Если кто-то еще наткнется на такую ​​ошибку, оставьте комментарий, потому что кажется, что это ошибка библиотеки python datetime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...