本周早些时候我遇到了这个日期和时间约束问题,并没有真正找到任何算法的好方法。我所得到的每个想法都会停止,像如果这是一个闰年呢?或如果这是什么东西在晚上,当我们从DST到/更改用于计算cron表达式应该触发的最后时间的算法?
运行输入:一个crontab
表达(上CRON format维基百科,Cron)。例如:
0 */5 2,14 * * *
含义每五分钟的时候,时间是2或14
30 5 */2 1 * * */2
含义5:30过去的每一个小时,即使在每个月的第一天,每个偶数年。
输出:上一次这种表达是真实的。 如果在上午11点00分十一月运行第一,2009年,输出应该是:
2009-11-01 02:55:00
用于第一示例和
2008-11-01 10:05:30
用于第二。
一些注意事项:
似乎有一对夫妇的cron表达式格式的变化:一些包括秒,一些包括一年。一般问题应该大致相同。
随意应用合理的约束;例如,在1970年以前不能处理的情况下,完全没问题。
我目前的直觉是,当我们遇到无效的日期和时间时,从一年到下一个深度优先搜索到第二个回溯。
蛮力的方法可能是每天倒数一次,并评估cron表达式的日期部分(自1970年以来只有大约15k天)。当找到有效的日期时,对时间部分执行相同的操作。
答案不一定包含代码,我主要是在上面的算法大纲之后。
你基本上要求部分实现cron。为什么不直接查找来源? – 2009-11-04 14:35:27
继续本的评论。你可以看看Perl Schedule :: Cron :: Events,它公开了一个方法'previousEvent',它执行你所追求的内容。推测他们的方法可以从源头上确定。 http://search.cpan.org/~pkent/Schedule-Cron-Events-1.8/lib/Schedule/Cron/Events.pm – 2009-11-04 23:31:31