Вы можете использовать datetime.replace()
с некоторыми арифметическими значениями даты и времени c:
import datetime as dt
def next_datetime(current: dt.datetime, hour: int, **kwargs) -> dt.datetime:
repl = current.replace(hour=hour, **kwargs)
while repl <= current:
repl = repl + dt.timedelta(days=1)
return repl
Демо:
>>> now = dt.datetime.utcnow()
>>> now
datetime.datetime(2020, 5, 7, 20, 17, 21, 581402)
>>> next_datetime(now, hour=19)
datetime.datetime(2020, 5, 8, 19, 17, 21, 581402)
>>> next_datetime(now, hour=21)
datetime.datetime(2020, 5, 7, 21, 17, 21, 581402)
>>> next_datetime(now, hour=20, minute=12)
datetime.datetime(2020, 5, 8, 20, 12, 21, 581402)
>>> next_datetime(now, hour=20, minute=50)
datetime.datetime(2020, 5, 7, 20, 50, 21, 581402)
Здесь **kwargs
предназначен для приема datetime()
параметров конструктора которые имеют более высокое разрешение, чем hour
, например минуты, секунды и микросекунды. Вы можете подтвердить это, поскольку передача чего-то вроде year
не имеет смысла, учитывая вопрос.