Подождите до определенного времени

Я пишу программу, которая будет что-то делать, если 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


sleep(5) вы уверены, что вам нужно 5 секунд. точность? Кроме того, вам действительно нужно ждать, когда придет время? почему не в.н. используйте cron для запуска вашего скрипта в заданное время
Marcin Orlowski 09.04.2019 02:07

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

Barmar 09.04.2019 02:09

Отвечает ли это на ваш вопрос? Как спать до определенного времени ГГГГ-ММ-ДД ЧЧ:ММ:СС?

gerardw 16.10.2020 18:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
3
2 051
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы инициализируете свою переменную 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

Другие вопросы по теме