根据cron规格计算下一个计划时间

问题描述:

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

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

例子可能是:

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

Python代码将是可爱的,但伪代码或高级描述也将不胜感激。

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

+0

我已经做了这样的事情,并发现很难得到正确的(和我可能的“规格”是你的子集)。我只是用一些日期时间的计算和函数来完成每个规范的'类型'。我很感兴趣,如果有人有更好的答案(解决方案可能会使用库:x) – Gerrat 2011-01-06 01:23:41

+0

你可以举一个规格格式的例子吗? – aaronasterling 2011-01-06 01:41:47

只是看着它,我想你需要:

  • 解析克隆氏病规范包含每个字段的可接受值的5个阵列;
  • 将'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 

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

+0

不错,找到croniter,非常感谢。我会把问题留给开放一段时间,看看是否有人在我们身上投下一个奇妙的算法。 – Parand 2011-01-06 19:54:31

+0

感谢您的回答。我使用你的代码来使它工作,但我需要将它作为EXE文件运行,所以我使用py2exe将它编译成一个。对于任何想要使用它的人,你可以从这里下载它:http://www.toughtomato.com/cron2NextDate/。用法示例:cron2NextDate.exe“0 15 1 * *” – Martin 2011-03-18 12:55:07

+0

不幸的是'croniter'不适用于DST更改。 – mike 2013-02-25 15:09:00

Later.js是一个JavaScript库,只是这样做。它能够解析Cron表达式,然后计算日程安排的未来事件。算法不是很花哨,但是它完成了这项工作。也许值得一瞧。