根据cron规范计算下一个计划时间
有什么高效的方法可以根据当前时间和一个cron表达式来计算下一个事件的运行时间呢?
我希望找到一种方法,而不是“每分钟循环检查一下是否符合规则”。
一些规则的例子可能是:
- 每个月的1号和15号的15:01
- 每小时的10、20、30、40、50分钟
如果能提供Python代码那就太好了,不过伪代码或者简单的描述也可以。
[更新] 假设这个规则已经被解析,并且是以某种合理的格式存在。
1 个回答
34
看起来你需要做以下几件事:
- 把时间设置的规则解析成五个数组,每个数组里包含每个字段可以接受的值;
- 把“现在”解析成每个字段的值;
- 按照分钟、小时、{日期或星期几}、月份的顺序:找到一个数组中最小的值,这个值要大于或等于当前值,并进行进位处理。
我不知道怎么同时处理星期几和日期;我相信有办法,但我也没见过同时指定这两者的规则。我觉得写一个处理其中一个的函数就够了,如果同时收到两个就报错。
编辑:显然,如果同时指定了星期几和日期,规则应该在两者上都生效——也就是说,如果规则是“每月15号,星期三”,那么它会在每个月的15号和每个星期三都触发。
croniter这个包可以满足你的需求:
import croniter
import datetime
now = datetime.datetime.now()
sched = '1 15 1,15 * *' # at 3:01pm on the 1st and 15th of every month
cron = croniter.croniter(sched, now)
for i in range(4):
nextdate = cron.get_next(datetime.datetime)
print nextdate
打印结果是
2011-01-15 15:01:00
2011-02-01 15:01:00
2011-02-15 15:01:00
2011-03-01 15:01:00
不过如果它能写成一个真正的迭代器就更好了。也许这会是我下一个项目的方向 ;-)