Разница времени между двумя датами
Мне нужно сделать кд на команду, чтобы нельзя было писать команду чаще, чем раз в 30 минут. Дату и время первого ввода команды буду сохранять в бд, ну с этим я сам разберусь. Я не могу найти разницу в 30 минут между предыдущим отправлением и текущим, получаю всякие ошибки по типу TypeError: '>' not supported between instances of 'datetime.timedelta' and 'datetime.time' и тд.. Я понял как найти разницу между 1 датой и временем и 2, но как ее сравнить с 30 минутами?
first_message_date = 2023-01-10 01:03:12
second_message_date = 2023-01-10 01:03:07
print(first_message_date - second_message_date)
0:00:05
Как мне сравнить эту разницу с 30 минутами. Я понял, что 30 минут это
print(datetime.time(0, 30, 0))
00:30:00
Но я не понимаю, как мне сравнить эти 2 даты с временем. Поэтому вопрос такой, как сравнить 2 даты , если разница больше 30 минут, то, к примеру, вывести True, если меньше, то False.
Ответы (2 шт):
Для сравнения дат используется класс timedelta. Любая арифметическая операция между двумя объектами класса datetime возвращает объект класса timedelta.
В результате, имеем следующий код:
from datetime import datetime, timedelta
first_message_date = datetime(2023, 1, 10, 1, 3, 12)
second_message_date = datetime(2023, 1, 10, 1, 3, 7)
third_message_date = datetime(2023, 1, 10, 1, 34, 7)
delta_time = timedelta(minutes=30)
print(second_message_date - first_message_date > delta_time)
print(third_message_date - first_message_date > delta_time)
Я бы вообще на вашем месте не юзал бы datetime, а использовал бы unix-время, например, через time
Тогда дату можно будет хранить как простое число, да и к/д на команду будет задать проще. Пример:
import time
last_invoke: int = 12345 # время вызова старой команды, из бд
is_on_timeout: bool = (last_invoke + 1800) > time.time() # 1800 - 30 мин. в сек.
Время в БД можно будет сохранять просто как INTEGER, что вроде бы даже будет поэкономичнее (поправьте если не прав).