2009-11-04 27 views
0

本周早些时候我遇到了这个日期和时间约束问题,并没有真正找到任何算法的好方法。我所得到的每个想法都会停止,像如果这是一个闰年呢?如果这是什么东西在晚上,当我们从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天)。当找到有效的日期时,对时间部分执行相同的操作。

答案不一定包含代码,我主要是在上面的算法大纲之后。

+0

你基本上要求部分实现cron。为什么不直接查找来源? – 2009-11-04 14:35:27

+1

继续本的评论。你可以看看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

回答

0

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

如果你想自己写,那么你不应该在cron(这是小问题),而是在TimeZone实现。闰年是你必须解决的最简单的问题。每个时区都会保留所有时间相关更改的历史记录:管理小时更改(夏令时),管理日期更改(引入公历日期),甚至闰秒以及影响时区所代表的区域时间的每个事件