@liss48

Почему код не работает так как должен?

Данный код разрешает выполнять определенную команду раз в 3 минуты, он работает:

last_command_use_time = dict_time.get(user[0].id)

if not last_command_use_time or (datetime.datetime.now() - last_command_use_time).seconds > 180:
    # выполнение команды
    dict_time[user[0].id] = datetime.datetime.now()
else:
    # сообщение о том что 3 минуты не прошло


Но когда я повышаю время до 24 часов, в первый раз код дает выполнить команду а дальше при окончании таймера он сам сбрасывается и начинается снова, и я не могу использовать команду, код:

last_command_use_time = dict_time.get(user[0].id)

if not last_command_use_time or (datetime.datetime.now() - last_command_use_time).days > 1:
    # выполнение команды
    dict_time[user[0].id] = datetime.datetime.now()
else:
    # сообщение о том что 24 часа не прошло


Я пробовал считать секундами то есть 86400 секунд, история та же. Параметры minute, hour и day он не хочет принимать. Пробовал поставить 23 часа - тоже самое. Если ставить один час секундами то все работает.
  • Вопрос задан
  • 103 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Ну для начала, разность двух datetime даёт объект timedelta.
И в доках написано так:
Only days, seconds and microseconds are stored internally. Arguments are converted to those units:
A millisecond is converted to 1000 microseconds.
A minute is converted to 60 seconds.
An hour is converted to 3600 seconds.
A week is converted to 7 days.

Т.е. timedelta(days=1).seconds даст 0, так как это 1 день и 0 секунд.

Выхода два.
1. Построй объект timedelta, описывающий таймаут операции, и сравнивай с ним напрямую.
timeout = datettime.timedelta(days=1)
if (datetime.datetime.now() - last_command_use_time) > timeout:
    ...

2. Используй метод total_seconds()
timeout = datettime.timedelta(days=1)
if (datetime.datetime.now() - last_command_use_time).total_seconds() > 24*60*60:
    ...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы