user11040244
user11040244

Reputation:

Wait until specific time

I'm writing a program that will do something if now == specific time and day and wait till that time if is not equal.

I have a morning, evening, days values, which shows start time, end time and today's day. I would like to make a program that check if today is a weekday and specific time (between morning and evening) if True to do something and if even one of these is False, gonna wait till that time and after that do something.

I did it with while loop but when it starts with False value(not in right time) it continue printing False even if that time came and value should change to True but it shows True when I start it in right time.

Here is the code:


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


Upvotes: 3

Views: 4238

Answers (2)

Prashanti
Prashanti

Reputation: 173

If you are interested in checking just the hours to determine morning and evening as I can see in your code, you can use below snippet:

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

Upvotes: 0

Selcuk
Selcuk

Reputation: 59444

You only initialize your now variable once and never update its value to the current now. You should update the value inside the while loop, for example:

while dayz == False or timerange == False:
    sleep(5)
    now = datetime.datetime.now()
    ...

Upvotes: 1

Related Questions