Я пишу программу, которая будет что-то делать, если 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
Вместо того, чтобы спать в цикле, рассчитайте количество секунд до начала следующего временного диапазона и спите в течение этого количества секунд.
Отвечает ли это на ваш вопрос? Как спать до определенного времени ГГГГ-ММ-ДД ЧЧ:ММ:СС?
Вы инициализируете свою переменную now
только один раз и никогда не обновляете ее значение до текущего сейчас. Вы должны обновить значение внутри цикла while
, например:
while dayz == False or timerange == False:
sleep(5)
now = datetime.datetime.now()
...
Если вы хотите проверить только часы, чтобы определить утро и вечер, как я вижу в вашем коде, вы можете использовать приведенный ниже фрагмент:
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
sleep(5)
вы уверены, что вам нужно 5 секунд. точность? Кроме того, вам действительно нужно ждать, когда придет время? почему не в.н. используйте cron для запуска вашего скрипта в заданное время