【问题标题】:Calculate next scheduled time based on cron spec根据 cron 规范计算下一个预定时间
【发布时间】:2011-06-04 09:33:38
【问题描述】:

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

我正在寻找“每分钟循环检查是否符合规范”以外的其他内容。

规格示例可能是:

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

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

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

【问题讨论】:

  • 我做过类似的事情,但发现很难做到正确(我可能的“规格”是你的一个子集)。我只是对每个规范的type 进行了一些日期时间计算和函数。如果有人有更好的答案,我很感兴趣(解决方案可能是使用库:x)
  • 你能举一个规范格式的例子吗?
  • Later.js 是一个 javascript 库,它就是这样做的。它能够解析 Cron 表达式,然后计算计划的未来发生。它的算法不是很花哨,但它可以完成工作。可能值得一看。

标签: python algorithm cron scheduler


【解决方案1】:

仅看一下,我认为您需要:

  • 将 chron 规范解析为五个数组,其中包含每个字段的可接受值;
  • 将“现在”解析为每个字段的值;
  • 按分钟、小时、{day-of-month OR day-of-week}、month-of 的顺序:查找与当前值匹配或超过当前值的最低数组值,并进行进位校正。

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

编辑: 显然,如果同时指定了星期几和月份,它应该在 both 上触发 - 即如果规则是 ' 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

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

【讨论】:

  • 很好地找到了 croniter,非常感谢。我将把这个问题留待更长时间,看看是否有人向我们抛出了一个很棒的算法。
  • 感谢您的回答。我使用您的代码使其工作,但我需要将其作为 EXE 文件运行,因此我使用 py2exe 将其编译为一个。任何想要使用它的人都可以从这里下载:toughtomato.com/cron2NextDate。用法示例:cron2NextDate.exe "0 15 1 * *"
  • 不幸的是,croniter 仅在 UTC 时间进行评估。我必须将我的表达式调整为 UTC 时间
猜你喜欢
  • 2023-01-13
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2022-11-01
  • 1970-01-01
相关资源
最近更新 更多