2011-01-06 14 views
11

現在の時刻とcron仕様を考慮して、イベントの次の実行時間を計算する効率的な方法は何ですか?cron仕様に基づいて次の予定時刻を計算してください

「ループが毎回ループして仕様に合っているかどうか」以外のものを探しています。スペックの

例としては、次のようになります。時間過去10,20,30,40,50分で1日に

  • 毎月、および15時01分
  • で15時間ごと

Pythonコードは素敵ですが、擬似コードまたは高レベルの説明も高く評価されます。

[更新]仕様がすでに解析されていて、合理的な形式であるとします。

+0

私はこのようなことをしており、正しいことをするのは難しいと感じました(そして、私の可能な「スペック」はあなたのサブセットです)。私はちょうど日時計算と関数のそれぞれの 'タイプ'の仕様でそれをしました。私は誰かがより良い答えを持っている場合は興味があります(ソリューションはおそらくuse library:xになります) – Gerrat

+0

spec形式の例を挙げてください。 – aaronasterling

答えて

10

ちょうどそれを見て、私はあなたがする必要があると思う:

  • は、各フィールドの許容値を含む5つのアレイにクロン仕様を解析します。
  • 各フィールドの値に 'now'を解析します。
  • 分の順、{日の月または曜日}、現在の値と一致するかまたはそれを超える最小の配列値を見つけ、桁上がりを修正します。

曜日と曜日を同時に処理する方法がわかりません。私は方法があると確信していますが、一方で、私は実際に両方を指定した仕様を見たことはないと思います。いずれかのハンドラを作成し、両方を受け取った場合はエラーをスローするだけで十分だと思います。

編集:曜日と日の-月が両方指定されている場合は明らかに、両方に起動するようになっている - ルールは「15日、水曜日のであれば、すなわちそれが起動します毎週水曜日に15:30毎にとなります。

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

ニースのクローネを見つけて、大変感謝します。誰かが私たちの上に素晴らしいアルゴリズムを落とすかどうか見るために少し質問を残しておきます。 – Parand

+0

答えをありがとう。あなたのコードを使って動作させましたが、py2exeを使ってコンパイルしたので、EXEファイルとして実行する必要がありました。誰もがそれを使用したい場合は、ここからダウンロードできます:http://www.toughtomato.com/cron2NextDate/使用例:cron2NextDate.exe "0 15 1 * *" – Martin

+0

残念ながら、croniterはDSTの変更には対応していません。 – mike

2

Later.jsはこれだけのjavascriptライブラリです。 Cron式を解析して、その後のスケジュールの発生を計算することができます。アルゴリズムはそれほど派手ではありませんが、それは仕事です。一見の価値があるかもしれません。

関連する問題