Ждать до определенного времени - PullRequest
3 голосов
/ 09 апреля 2019

Я пишу программу, которая будет что-то делать, если now == specific time and day, и ждать до этого времени, если она не равна.

У меня есть значения morning, evening, days, которые показывают время начала, время окончания и сегодняшний день. Я хотел бы создать программу, которая проверяет, является ли сегодня будний день и определенное время (между morning и evening), если True что-то делает, и если хотя бы один из них является False, буду ждать до этого времени и после этого сделай что-нибудь.

Я сделал это с while loop, но когда он начинается со значения False (не в нужное время), он продолжает печатать False, даже если это время наступило и значение должно измениться на True, но оно показывает True когда я начну в нужное время.

Вот код:


import datetime
from datetime import date
from time import sleep

#setting values
now = datetime.datetime.now()
morning = now.replace(hour=9, minute=00, second=0, microsecond=0)
evening = now.replace(hour=16, minute=0, second=0, microsecond=0)
days = now.strftime("%A")

#check if time is in range and return True or False
def time_in_range(morning, evening, x):
    if morning <= evening:
        return morning <= x <= evening
    else:
        return morning <= x or x <= evening
timerange = time_in_range(morning, evening, now)

#check if today is weekday
if date.today().weekday() == 0:
    dayz = True
else:
    dayz = False

# If today weekday and time range do something
if dayz == True and timerange == True:
    print("Yes")

while dayz == False or timerange == False:
    sleep(5)
    timerange = time_in_range(morning, evening, now)
    print(timerange) #this printing false even if is right time.
# But it shows True when I turn it on in right time


Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Вы только инициализируете переменную now один раз и никогда не обновляете ее значение до текущего , теперь . Вам следует обновить значение внутри цикла while, например:

while dayz == False or timerange == False:
    sleep(5)
    now = datetime.datetime.now()
    ...
1 голос
/ 09 апреля 2019

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

from datetime import datetime
from datetime import timedelta
from time import sleep

morning_hour = 9
evening_hour = 16

while True:
    curr_time = datetime.now()
    print("Current time : {0}".format(curr_time))
    if curr_time.hour < morning_hour or curr_time.hour > evening_hour or not curr_time.isoweekday():
        print("Job start conditions not met. Determining sleep time")
        add_days = 0
        current_day = curr_time.weekday() == 4
        # Add 3 days for fridays to skip Sat/Sun
        if current_day == 4:
            add_days = 3
        # Add 2 days for Saturdays to skip Sunday
        elif current_day == 5:
            add_days = 2
        else:
            add_days = 1
        next_window = (curr_time + timedelta(days=add_days)).replace(hour=9, minute=0,second=0,microsecond=0)
        delta = next_window - datetime.now()
        print("Sleep secs : {0}".format(delta.seconds))
        sleep(delta.seconds)
    else:
        print("Do something")
        break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...