本週早些時候我遇到了這個日期和時間約束問題,並沒有真正找到任何算法的好方法。我所得到的每個想法都會停止,像如果這是一個閏年呢?或如果這是什麼東西在晚上,當我們從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