Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sleep till next 15 minute hourly interval (00:00, 00:15, 00:30, 00:45)

I need my script to sleep till the next 15 minute hourly interval, e.g. on the hour, quarter past, half past, and quarter too.

It will look something like this

While True:
    //do something
    sleepy_time = //calculate time to next interval
    time.sleep(sleepy_time)

You could write a series of if statements to check what the current minutes past the hour is then do ‘if current < 15’ and ‘if current < 30’ etc but that seems messy and inefficient.

EDIT: Building on @martineau's answer this is the code I went with.

import datetime, time

shouldRun = True
if datetime.datetime.now().minute not in {0, 15, 30, 45}:
    shouldRun = False
# Synchronize with the next quarter hour.
while True:
    if shouldRun == False:
        current_time = datetime.datetime.now()
        seconds = 60 - current_time.second
        minutes = current_time.minute + 1
        snooze = ((15 - minutes%15) * 60) + seconds
        print('minutes:', minutes, 'seconds', seconds, ' sleep({}):'.format(snooze))
        localtime = time.asctime( time.localtime(time.time()))
        print("sleeping at " + localtime)
        time.sleep(snooze)  # Sleep until next quarter hour.
        shouldRun = True
    else:
        localtime = time.asctime( time.localtime(time.time()))
        print("STUFF HAPPENS AT " + localtime)
        shouldRun = False

The difference between his answer and this is that this run the else block only once per interval then if the minute is still on the 0, 15, 30, 45 interval calculates the extra seconds to add to the minutes to sleep till the next interval.

like image 275
Flatlyn Avatar asked Nov 18 '25 07:11

Flatlyn


1 Answers

You can achieve this using datetime...

A call to datetime.datetime.now() will return a datetime which you can get the current minute past the hour with .minute.

Once we have the number of minutes past the hour, we can do that modulo 15 to get the number of minutes to the next interval of 15.

From here, simply do a call to time.sleep() with that number of minutes times 60 (60 seconds in a minute).

The code for this may look something like:

import datetime, time

minutesToSleep = 15 - datetime.datetime.now().minute % 15
time.sleep(minutesToSleep * 60)
print("time is currently at an interval of 15!")
like image 132
Joe Iddon Avatar answered Nov 21 '25 00:11

Joe Iddon



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!