2011-01-06 20 views
11

के आधार पर अगले निर्धारित समय की गणना करें वर्तमान समय और क्रॉन स्पेक दिए गए किसी ईवेंट के अगले रन टाइम की गणना करने का एक प्रभावी तरीका क्या है?क्रॉन स्पेक

मैं के अलावा कुछ के लिए देख रहा हूँ "हर मिनट की जाँच के माध्यम से लूप अगर यह कल्पना से मेल खाता है"।

चश्मा के उदाहरण हो सकता है:

  • हर महीने, 1 और 15 15:01
  • पर पर घंटे अतीत 10,20,30,40,50 मिनट हर घंटे
पर

पायथन कोड सुंदर होगा लेकिन psuedo कोड या उच्च स्तरीय विवरण की भी सराहना की जाएगी।

[अपडेट] मान लें कि spec पहले से ही पार्स किया गया है और कुछ उचित प्रारूप में है।

+0

मैंने ऐसा कुछ किया है, और इसे सही पाने के लिए मुश्किल लगता है (और मेरी संभव "चश्मा" आपके सबसेट हैं)। मैंने बस कुछ डेटाटाइम कैल्क्स और spec के प्रत्येक 'प्रकार' के लिए फ़ंक्शंस के साथ किया। मुझे दिलचस्पी है अगर किसी के पास कोई बेहतर जवाब है (समाधान शायद लाइब्रेरी का उपयोग करेगा: x) – Gerrat

+0

क्या आप spec प्रारूप का उदाहरण दे सकते हैं? – aaronasterling

उत्तर

10

बस इसे देख, मैं तुम्हें करने की जरूरत है लगता है:

  • पार्स प्रत्येक क्षेत्र के लिए स्वीकृत मान युक्त पांच सरणियों को chron कल्पना;
  • पार्स 'अब' प्रत्येक फ़ील्ड के लिए मूल्य के लिए;
  • मिनट, घंटे, के क्रम में {दिन के अनुसार महीने या दिन के सप्ताह}, महीने की साल: से मेल खाता है या वर्तमान मूल्य से अधिक है, कैरी के लिए सही करने न्यूनतम सरणी मान पाते हैं।

मुझे नहीं पता कि दिन-प्रति-सप्ताह और दिन-दर-दिन एक साथ कैसे संभालना है; मुझे यकीन है कि एक रास्ता है, लेकिन दूसरी तरफ मुझे नहीं लगता कि मैंने कभी एक ऐसा नमूना देखा है जो वास्तव में दोनों को निर्दिष्ट करता है। मुझे लगता है कि यदि आप दोनों प्राप्त करते हैं तो एक हैंडलर लिखना और त्रुटि को फेंकना पर्याप्त होगा।

संपादित करें: जाहिरा तौर पर करता है, तो दिन के सप्ताह और दिन के अनुसार महीने के दोनों निर्दिष्ट कर रहे हैं, यह दोनों पर गोली चलानी है - यानी अगर नियम '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

क्रोनिटर के साथ अच्छा लगता है, बहुत धन्यवाद। मैं इस सवाल को थोड़ी देर के लिए छोड़ दूंगा कि यह देखने के लिए कि क्या कोई हमारे ऊपर एक शानदार एल्गोरिदम छोड़ देता है। – Parand

+0

उत्तर के लिए धन्यवाद।मैंने इसे काम करने के लिए अपने कोड का उपयोग किया, लेकिन मुझे इसे EXE फ़ाइल के रूप में चलाने की आवश्यकता थी, इसलिए मैंने इसे py2exe का उपयोग करके एक में संकलित किया। किसी भी व्यक्ति के लिए इसका उपयोग करना चाहते हैं, आप इसे यहां से डाउनलोड कर सकते हैं: http://www.toughtomato.com/cron2NextDate/। उपयोग उदाहरण: cron2NextDate.exe "0 15 1 * *" – Martin

+0

दुर्भाग्यवश 'croniter' डीएसटी परिवर्तनों पर काम नहीं करता है। – mike

2

Later.js एक जावास्क्रिप्ट पुस्तकालय है कि सिर्फ इस करता है मिल गया है। यह एक क्रोन अभिव्यक्ति को पार्स करने में सक्षम है और फिर शेड्यूल की भविष्य की घटनाओं की गणना करता है। यह एल्गोरिदम बहुत फैंसी नहीं है, लेकिन यह नौकरी करता है। देखने लायक हो सकता है।

संबंधित मुद्दे