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


在给定当前时间和cron规范的情况下,计算事件的下一个运行时间的有效方法是什么?

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

规范示例可能是:

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

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

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


1733
2018-01-06 01:12


起源

我做过这样的事情,发现做对了很棘手(我的可能“规格”是你的一部分)。我只是用一些日期时间计算和每个函数来完成它 type 规格我很感兴趣,如果有人有更好的答案(解决方案可能会使用库:x) - Gerrat
你能举一个规格格式的例子吗? - aaronasterling


答案:


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

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

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

编辑: 显然,如果指定了星期几和星期几,那么它应该开启   - 即如果规则为'15th,Wednesday',它将每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

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


11
2018-01-06 02:13



与croniter很好找,非常感谢。我会把这个问题保持开放一段时间,以确定是否有人在我们身上删除了一个很棒的算法。 - Parand
感谢你的回答。我使用你的代码使它工作,但我需要将它作为EXE文件运行,所以我使用py2exe将其编译成一个。对于任何想要使用它的人,您可以从这里下载: toughtomato.com/cron2NextDate。用法示例:cron2NextDate.exe“0 15 1 * *” - Martin
不幸 croniter 不适用于DST更改。 - mike


Later.js 是一个javascript库,它就是这样做的。它能够解析Cron表达式,然后计算计划的未来出现次数。它的算法不是很花哨,但它可以完成这项任务。也许值得一瞧。


3
2018-02-09 18:36