Python получить дату и время следующего события - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь найти СЛЕДУЮЩИЙ datetime, в котором встречается указанное c время.

Например:

now = datetime.datetime.now() # April 5th, 1 PM
desired_time = '14:00:00' # 2 PM
next_datetime_occurance = get_next_datetime(now, desired_time) # Returns April 5th, 2PM

now = datetime.datetime.now() # April 5th, 3 PM
desired_time = '14:00:00' # 2 PM
next_datetime_occurance = get_next_datetime(now, desired_time) # Returns April 6th, 2PM

Как мне сделать это аккуратно? (Предположим, что все в UT C)

1 Ответ

2 голосов
/ 07 мая 2020

Вы можете использовать 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 не имеет смысла, учитывая вопрос.

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