我需要精确地08:00, 18:00, 22:00
小时来调用一个函数。我创建了一个示例来测试小时之间的比较。当当前时间达到这些天数之一。放入While循环中,以为该示例可以用作秒表,但我认为我错了。比较这些值的最佳方法是什么?
currentH= dt.datetime.now().strftime("%H:%M:%S")
h = "16:15:10"
while True:
if(currentH==h):
print 'Ok'
print 'The current Hour is: '+h
答案 0 :(得分:0)
import datetime as dt
import time
currentH= dt.datetime.now().replace(microsecond=0).time()
hrs = ['00:02', '12:00']
for i in range(len(hrs)):
h = [int(x) for x in hrs[i].split(':')]
h = dt.datetime.now().replace(hour=h[0], minute=h[1], second=0,microsecond=0).time()
hrs[i] = h
while True:
currentH = dt.datetime.now().replace(microsecond=0).time()
print(currentH)
if currentH in hrs:
print('Time is now',currentH)
time.sleep(1)
答案 1 :(得分:0)
代码的最大问题是,您再也不会在循环内再次调用now()
了,因此您将一直在旋转初始时间与16:15:10
进行比较。
我们正在这么做:为什么将时间转换为字符串以进行比较,而不只是比较时间?
但是这种设计存在较大的问题,无法轻易解决。
如果您检查16:15的时间,然后入睡,然后在16:25醒来,会发生什么?然后now()
从不返回16:15:10。
还,您是否真的想在10个小时内消耗100%的CPU?
更好的解决方案是编写一个sleep_until
函数:
def sleep_until(target):
left = target - dt.datetime.now()
if left > dt.timedelta(seconds=0):
time.sleep(left.total_seconds())
(如果您使用的是Python 2.7或3.4,则要复杂一些,因为如果有信号,sleep
会早起。但是要处理这种情况,您只需添加一个{{1 }}遍历整个内容。
现在,唯一棘手的问题是您第一次需要睡觉之前要进行锻炼,这并不是那么棘手:
while True:
现在,我们只是永远循环等待,一直等到下一次:
waits = itertools.cycle(dt.timedelta(hours=wait) for wait in (10, 4, 10))
now = dt.datetime.now()
start = dt.datetime.combine(dt.date.today(), dt.time(hour=8))
for wait in waits:
start += wait
if start > now:
break
或者,当然,您可以从PyPI中获取许多调度库之一。
或者仅使用平台的cron / launchd / Scheduled Tasks API来运行脚本。