计算上次cron表达式应该触发的算法?

时间:2009-11-04 14:26:28

标签: language-agnostic cron algorithm

本周早些时候我遇到了这个日期和时间限制问题,并没有真正找到任何好算法。如果这是一个闰年,那么每个想法都会停止,例如会是什么?如果这是在我们改为/从DST转换的那天晚上运行 < / p>


输入crontab表达式(CRON format上的维基百科,Cron)。例如:

0 */5 2,14 * * *

含义小时为2或14时每五分钟

30 5 */2 1 * * */2

意思每个月的第一个晚上5点30分,每年甚至一年。


输出:此表达式的最后一次为真。 如果在2009年11月11日上午11点运行,则输出应为:

2009-11-01 02:55:00 
第一个例子的

2008-11-01 10:05:30

第二个。


一些注意事项:

cron表达式格式似乎有几种变体:有些包括秒,有些包括年份。一般问题应该大致相同。

随意应用明智的约束;例如,完全可以在1970年之前处理。

我目前的直觉是,当我们遇到无效的日期和时间时,从年份到第二次的深度优先搜索,回溯。

蛮力方法可能是一次倒退一天,并评估cron表达的日期部分(自1970年以来仅有大约15k天)。找到有效日期后,对时间部分执行相同操作。

答案不必包含代码,我主要是按照上面的算法大纲。

1 个答案:

答案 0 :(得分:0)

我不知道你是想得到这份工作,还是想为了教育而自己编写算法。在第一种情况下,可能每种语言都有自己的cron作业实现,只需获取计算时间并使用它的cron部分。这是java中的一个示例:http://blog.piotrturski.net/2013/06/testing-cron-expression.html

如果您想自己编写,那么您不应该在cron上(这是次要问题),而是在TimeZone实现上。闰年是您必须解决的最简单的问题。每个时区都保存所有与时间相关的更改的历史记录:行政时间更改(夏令时),管理日期更改(引入格里高利历),甚至可能是闰秒,以及影响时区所代表区域时间的每个事件