2011-01-06 11 views
11

Geçerli saat ve bir cron spec verilen bir olayın sonraki çalışma süresini hesaplamanın verimli bir yolu nedir?Cron spesifikasyonuna göre sonraki zamanlamayı hesaplayın

"Spesifikasyonlarla eşleşip eşleşmediğini kontrol ederek her dakikadan bir döngü" dışında bir şey arıyorum. Özelliklerin

Örnekler olabilir:

  • Her ay, 15:01
  • de 1. ve 15 saat geçmiş 10,20,30,40,50 dakika her saat
At

Python kodu güzel olurdu ama psuedo kodu veya üst düzey açıklamalar da takdir edilecektir.

[Güncelleme] Özelliğin zaten ayrıştırılmış olduğunu ve bazı makul biçimlerde olduğunu varsayın.

+0

Böyle bir şey yaptım ve doğru olması zor buldu (ve olası "özellikleri" sizin bir alt kümenizdir). Ben sadece bazı datetime calcs ile yaptım ve her tür 'spec' için fonksiyonlar. Birisinin daha iyi bir cevabı varsa ilgilenirim (çözüm muhtemelen kütüphane kullanacaktır: x) – Gerrat

+0

Örnek biçiminin bir örneğini verebilir misiniz? – aaronasterling

cevap

10

Sadece bakmak, sana ihtiyacım var:

  • ayrıştırmak her alan için kabul edilebilir değerler içeren beş diziler için chron Spec;
  • Her alan için 'şimdi' ayrıştırma;
  • dakika, saat, {gün-ayı VEYA haftanın günü günü), ayın yılı: geçerli değerle eşleşen veya bu değeri aşan en düşük dizi değerini, taşıma için düzeltir.

Hafta içi gün ve ayın eşzamanlı olarak nasıl işleneceğini bilmiyorum; Eminim bir yol var, ama öte yandan, aslında her ikisini de belirten bir özellik görmedim. Her ikisini de alırsanız bir işleyiciyi yazmak ve bir hata atmak yeterli olacaktır.

Düzenleme: Her ikisi de belirtildiğinde görünüşte günlük haftalık-ve günündeki ay, eğer hem ateş gerekiyordu - kural 'Çarşamba 15' ise, yani o tetiklenir Her Çarşamba günü her 15th ve.

croniter paket istediğini yapar:

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 

baskılar

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

gerçek bir yineleyici olarak yazılır olsaydı çok güzel olurdu rağmen

. Belki de bir sonraki projem var ;-)

+0

Güzel croniter ile bul, çok teşekkürler. Kimsenin bize fantastik bir algoritma düşürdüğünü görmek için soruyu biraz daha açık bırakacağım. – Parand

+0

Cevabınız için teşekkürler.Çalışmak için kodunuzu kullandım, ancak bir EXE dosyası olarak çalıştırmam gerekiyordu, bu yüzden py2exe'yi kullanarak bir bilgisayara derledim. Kullanmak isteyen herkes için buradan indirebilirsiniz: http://www.toughtomato.com/cron2NextDate/. Kullanım örneği: cron2NextDate.exe "0 15 1 * *" – Martin

+0

Maalesef 'croniter' DST değişikliklerinde çalışmaz. – mike

2

Later.js sadece bunu yapan bir javascript kitaplığıdır. Bir Cron ifadesini ayrıştırabilir ve daha sonra programın gelecekteki sonuçlarını hesaplayabilir. Algoritma çok süslü değil, ama iş yapıyor. Bir göz atmaya değer.