我需要我的脚本睡到下一个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间隔,则计算额外的秒数,以添加到睡眠的分钟数,直到下一个间隔。
答案 0 :(得分:3)
datetime
... 致电datetime.datetime.now()
将返回datetime
,您可以使用minute
获取hour
之后的当前.minute
。
一旦我们minutes
的数量超过hour
,我们就可以执行modulo
15
来获得minutes
到下一个时间间隔的数量15
。
从这里开始,只需拨打time.sleep()
次minutes
次60
({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')