根据cron规范计算下一个预定时间

时间:2011-01-06 01:12:39

标签: python algorithm cron scheduler

根据当前时间和cron规范,计算事件的下一个运行时间的有效方法是什么?

我正在寻找除了“每分钟检查它是否符合规格”之外的其他内容。

规格示例可能是:

  • 每个月,1日和15日15:01
  • 每小时过去10,20,30,40,50分钟

Python代码很可爱,但是psuedo代码或高级描述也会受到赞赏。

[更新]假设规范已经解析并且格式合理。

2 个答案:

答案 0 :(得分:13)

看着它,我认为你需要:

  • 将chron规范解析为包含每个字段可接受值的五个数组;
  • 将'now'解析为每个字段的值;
  • 按分钟,小时,{日期或星期几},年份的顺序:找到匹配或超过当前值的最低数组值,并更正进位。

我不知道如何同时处理星期和日期;我确信有一种方法,但另一方面,我认为我从未见过实际指明两者的规范。我认为为两者编写处理程序就足够了,如果同时收到错误就抛出错误。

编辑:显然,如果同时指定星期几和星期几,则应该触发两者 - 即如果规则为' 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

虽然如果把它写成实际的迭代器会很好。也许我有我的下一个项目; - )

答案 1 :(得分:3)

Later.js是一个javascript库,可以做到这一点。它能够解析Cron表达式,然后计算计划的未来出现次数。它的算法并不是很花哨,但它确实起到了作用。可能值得一看。