睡到下一个15分钟的小时间隔(00:00,00:15,00:00,00:45)

时间:2017-09-30 19:30:12

标签: python python-2.7 time

我需要我的脚本睡到下一个15分钟的小时间隔,例如在小时,季度,半月和季度。

它看起来像这样

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

您可以编写一系列if语句来检查当前的小时数是多少,然后执行'if current< 15'和'如果当前< 30'等,但这似乎是凌乱和低效的。

编辑:在@ martineau的回答基础上,这是我使用的代码。

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

他的答案与此之间的区别在于,每个间隔只运行一次else块,然后如果分钟仍在0,15,30,45间隔,则计算额外的秒数,以添加到睡眠的分钟数,直到下一个间隔。

4 个答案:

答案 0 :(得分:3)

您可以使用datetime ...

来实现此目的

致电datetime.datetime.now()将返回datetime,您可以使用minute获取hour之后的当前.minute

一旦我们minutes的数量超过hour,我们就可以执行modulo 15来获得minutes到下一个时间间隔的数量15

从这里开始,只需拨打time.sleep()minutes60({1}}秒即可拨打60

这个代码可能类似于:

import datetime, time

minutesToSleep = 15 - datetime.datetime.now().minute % 15
time.sleep(minutesToSleep * 60)
print("time is currently at an interval of 15!")

答案 1 :(得分:2)

time.sleep(15*60 - time.time() % (15*60))

15*60每15分钟就有几秒钟的数字。

time.time() % (15*60)将是当前15分钟帧中传递的秒数(根据定义,时间0为00:00)。它从XX:00,XX:15,XX:30,XX:45增长到15 * 60-1(实际上,15*60-0.(0)1 - 取决于时间测量的精度),然后开始再次从0增长。

15*60 - time.time() % (15*60)是15分钟帧结束前的秒数。它使用基本数学,从15 * 60减少到0。

所以,你需要睡几秒钟。

但是,请记住,睡眠不会非常精确。在time.time()被测量之间处理内部指令需要一些时间,并且在系统级别实际调用time.sleep()。纳秒分数可能是一秒钟。但在大多数情况下,这是可以接受的。

另外,请记住,time.sleep()并不总是睡觉,因为它被要求睡多久。它可以被发送到进程的信号唤醒(例如,SIGALRM,SIGUSR1,SIGUSR2等)。因此,除了睡觉之外,还要检查time.sleep()之后是否到达了正确的时间,如果不是则再次睡觉。

答案 2 :(得分:1)

import time

L = 15*60

while True:
    #do something

    #get current timestamp as an integer and round to the
    #nearest larger or equal multiple of 15*60 seconds, i.e., 15 minutes
    d = int(time.time())

    m = d%L        
    sleepy_time = 0 if m == 0 else (L - m)

    print(sleepy_time)
    time.sleep(sleepy_time)

答案 3 :(得分:1)

我不认为@Joe Iddon的答案是对的,尽管它很接近。试试这个(注意我注释掉了我不想运行的行并添加了for循环来测试minute的所有可能值:

import datetime, time

# Synchronize with the next quarter hour.
#minutes = datetime.datetime.now().minute
for minutes in range(0, 59):
    if minutes not in {0, 15, 30, 45}:
        snooze = 15 - minutes%15
        print('minutes:', minutes, ' sleep({}):'.format(snooze * 60))
        #time.sleep(snooze)  # Sleep until next quarter hour.
    else:
        print('minutes:', minutes, ' no sleep')