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

23 投票
1 回答
22272 浏览
提问于 2025-04-16 09:29

有什么高效的方法可以根据当前时间和一个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

不过如果它能写成一个真正的迭代器就更好了。也许这会是我下一个项目的方向 ;-)

撰写回答