2009-11-04 79 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實現。閏年是你必須解決的最簡單的問題。每個時區都會保留所有時間相關更改的歷史記錄:管理小時更改(夏令時),管理日期更改(引入公曆日期),甚至閏秒以及影響時區所代表的區域時間的每個事件