2011-01-06 66 views
11

根據當前時間和cron規格計算事件下一個運行時間的有效方法是什麼?根據cron規格計算下一個計劃時間

我正在尋找除「通過每分鐘循環檢查它是否符合規格」之外的其他內容。規範的

例子可能是:

  • 每個月,在上15:01
  • 1日和15在每隔一小時
10,20,30,40,50分鐘過去一小時

Python代碼將是可愛的,但僞代碼或高級描述也將不勝感激。

[更新]假設規範已經被解析並且格式合理。

+0

我已經做了這樣的事情,並發現很難得到正確的(和我可能的「規格」是你的子集)。我只是用一些日期時間的計算和函數來完成每個規範的'類型'。我很感興趣,如果有人有更好的答案(解決方案可能會使用庫:x) – Gerrat 2011-01-06 01:23:41

+0

你可以舉一個規格格式的例子嗎? – aaronasterling 2011-01-06 01:41:47

回答

10

只是看着它,我想你需要:

  • 解析克隆氏病規範包含每個字段的可接受值的5個陣列;
  • 將'now'解析爲每個字段的值;
  • 按分鐘,小時,{月份或星期幾},月份 - 年份的順序:找到匹配或超過當前值的最低數組值,糾正進位。

我不知道如何同時處理星期幾和星期幾;我確信有一種方法,但另一方面,我不認爲我曾經見過一個實際上指定了兩者的規範。我認爲只要寫一個處理程序就足夠了,如果你同時收到一個錯誤就會拋出錯誤。

編輯:顯然,如果一個月中某一天的某一天的一週,同時指定,它應該是開槍 - 也就是說,如果規則是「15日,週三將火上每星期三每15日

的croniter包你想要做什麼:

import croniter 
import datetime 

now = datetime.datetime.now() 
sched = '1 15 1,15 * *' # at 3:01pm on the 1st and 15th of every month 
cron = croniter.croniter(sched, now) 

for i in range(4): 
    nextdate = cron.get_next(datetime.datetime) 
    print nextdate 

打印

2011-01-15 15:01:00 
2011-02-01 15:01:00 
2011-02-15 15:01:00 
2011-03-01 15:01:00 

雖然這將是很好,如果它被寫成一個實際的迭代器。也許我有我的下一個項目;-)

+0

不錯,找到croniter,非常感謝。我會把問題留給開放一段時間,看看是否有人在我們身上投下一個奇妙的算法。 – Parand 2011-01-06 19:54:31

+0

感謝您的回答。我使用你的代碼來使它工作,但我需要將它作爲EXE文件運行,所以我使用py2exe將它編譯成一個。對於任何想要使用它的人,你可以從這裏下載它:http://www.toughtomato.com/cron2NextDate/。用法示例:cron2NextDate.exe「0 15 1 * *」 – Martin 2011-03-18 12:55:07

+0

不幸的是'croniter'不適用於DST更改。 – mike 2013-02-25 15:09:00

2

Later.js是一個JavaScript庫,只是這樣做。它能夠解析Cron表達式,然後計算日程安排的未來事件。算法不是很花哨,但是它完成了這項工作。也許值得一瞧。