2009-10-10 9 views
30

मैं पुनरावर्ती घटनाओं को संग्रहीत करने के लिए एक डेटा संरचना पैटर्न की तलाश में हूं, लेकिन जिन चीजों के साथ मैं आया हूं, परिणामस्वरूप उच्च संख्या में विशेष केस हैंडलिंग या उपयोगकर्ता इनपुट और डेटा पुनर्प्राप्ति अत्यधिक जटिल होती है। (मुझे अलग-अलग भावना मिलती है, कि मुझे समस्या डोमेन को ऐसा करने के लिए पर्याप्त रूप से समझ में नहीं आया है।)पुनरावर्ती घटनाओं को संग्रहीत करने के लिए डेटा संरचना?

मैं Outlook-शैली पुनरावर्ती घटनाओं को कैसे संग्रहीत कर सकता हूं?

  • एक महीने में हर दिन 8:00
  • पर प्रत्येक पहले मंगलवार
  • तीन साल
  • एक सप्ताह
  • के लिए हर दो घंटे के लिए हर 1st दिसंबर ...

उत्तर

16

वहाँ इस उपयोग के मामले के लिए डेटा संरचनाओं और एल्गोरिदम का वर्णन करने वाले विभिन्न कागजात हैं। इसके अलावा आप crontab और Quartz (जावा) या Quartz.NET (.NET) के ओपन सोर्स कार्यान्वयन के कोड या विवरण देख सकते हैं।

यह ऐसे ही एक कागज

http://portal.acm.org/citation.cfm?id=359763.359801&coll=ACM&dl=ACM&CFID=63647367&CFTOKEN=55814330

उदाहरण के लिए, क्रॉन भंडार इस तरह की जानकारी है (* हर मतलब है, तो एक * माह के तहत इसका मतलब है हर महीने)

 

.---------------- minute (0 - 59) 
| .------------- hour (0 - 23) 
| | .---------- day of month (1 - 31) 
| | | .------- month (1 - 12) OR jan,feb,mar,apr ... 
| | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat 
| | | | | 
* * * * * 

There are several special entries, most of which are just shortcuts, 
that can be used instead of specifying the full cron entry: 

Entry  Description     Equivalent To 
@reboot Run once, at startup.  None 
@yearly Run once a year    0 0 1 1 * 
@annually (same as @yearly)   0 0 1 1 * 
@monthly Run once a month   0 0 1 * * 
@weekly Run once a week    0 0 * * 0 
@daily  Run once a day    0 0 * * * 
@midnight (same as @daily)   0 0 * * * 
@hourly Run once an hour   0 * * * * 

6
 
Event: 

StartDate 
EndDate (calculated on change of NumberOfOccurances) 
NumberOfOccurances (calculated on change of EndDate) 
Frequency e.g. 1/2hrs, 1/month, 1/day, .... 
CorrectionFunction e.g. first Tuesday, last Sunday, ... 

bool OccuresOn(day) 
Date NextOccurance(date) 
17

मानक का समर्थन करें iCalendar इवेंट प्रकार

IETF जब वे इंटरनेट कैलेंडर और शेड्यूलिंग कोर वस्तु विशिष्टता, के रूप में बेहतर आईकैलेंडर जाना जाता बनाई गई इस पर कुछ विचार करना।

विनिर्देश में घटना पुनरावृत्ति शामिल है।

एक अतिरिक्त बोनस के रूप में, आपका डेटाबेस अन्य iCalendar संगत डेटा स्रोतों जैसे Google और Apple कैलेंडर के साथ डेटा साझा करने के लिए सक्षम होगा।

http://tools.ietf.org/html/rfc5545

5

यहाँ मेरी ले है - मुझे पता है कि अगर मैं कुछ भी याद आ रही है तो कृपया:

आउटलुक पुनरावृत्ति विकल्पों के आधार पर, आप नियमित रूप से आवश्यक क्षेत्रों के साथ एक मेज है:

FieldName  DataType  Sample Data 
ID    int   primary key 
EventID   int   foreign key (to EventID from Event Table) 
StartTime  DateTime  8:00 AM 
EndTime   DateTime  8:30 AM 
Duration  int   30 (minutes) 
StartDate  DateTime  01/25/2014 
EndBy   DateTime  01/25/2024 
NoEndDate  bit   False 
NumOccurrences int   10 
RecurrenceType int   ****See below for instructions on how to use these last 6 fields 
Int1   int   
Int2   int 
Int3   int 
String1   nvarchar(50) 
IntYears  int 

यहां जादू होता है। इस तर्क के लिए केवल 4 पूर्णांक और एक स्ट्रिंग की आवश्यकता है।

The month of year (1 = Jan, 12 = Dec), 
The day of the month (1 = the 1st, 31 = 31st), 
Day of the week (0 = Sunday, 1=Monday, 6= Saturday), 
Week of the month (1 = first, 4 = forth, 5 = last), 
Yearly reocurrence (1=1,2=2) 
When multiple days can be selected I use a comma delimited string (1,3,5 = Monday, Wed, Friday) 

मैं क्रम में वे दृष्टिकोण नियुक्ति पुनरावृत्ति अनुसूचक में प्रदर्शित में 3 पूर्णांक दर्ज करते हैं, इस अतिरिक्त feilds, तर्क, झुंझलाहट बचाता है। * आप दृष्टिकोण appt नियोजक को खोलते हैं, तो यह पालन करने के लिए थोड़ा आसान हो जाएगा:

The RecurrenceType field can be any of the 7 following choices 

(दैनिक, मासिक और वार्षिक के लिए 2 विकल्प होते हैं और साप्ताहिक के लिए एक विकल्प हैं):

10 = Daily (Every `Int1` day(s))  
      Every  4 day(s) 
11 = Daily (Every Weekday) -- no variables needed 
      Every Weekday (MTWTF) 
20 = Weekly (Recur every `Int1` week(s) on: `String1` 
      Recur every  3 week(s) on Monday, Wednesday, Friday 
(`String1` will be a list of days selected (0=Sunday, 1=Monday, 2=Tuesday... 7=Saturday) so for (Mon, Wed, Fri) String1 would hold "1,3,5". You would parse this on the code side to pull the actual days.) 
30 = Monthly (Day `Int1` of every `int2' month(s) 
       Day 28 of every  2 month(s) 
31 = Monthly (The `Int1` `Int2` of every `Int3` month(s) 
       The forth Tuesday of every  1 month(s) 
40 = Yearly (Recur every `intYears` year(s) On `Int1` `Int2`) -- 
      Recur every   1 year(s) on Jan 28th 
41 = Yearly (Recur every `intYears` year(s) on the `Int1` `Int2` of `Int3`) -- 
      Recur every   1 year(s) on the forth Tuesday of January 

खींच या reocurrence को बचाने के लिए कोड काफी सरल हो जाता है

if (RecurrenceType = 10) 
    Every `int1` days 
if (RecurrenceType = 11) 
    Every Weekday 
if (RecurrenceType = 20) 
    Every `int1 weeks on 
    parse `string1` and populate checkboxes for Mon, Tues, ... 
if (RecurrenceType = 30) 
    `int1 day of every `int2` month 

etc... 

मुझे उम्मीद है कि मैं इसे पूरी तरह से समझा रहा हूं। अगर कुछ अस्पष्ट है या यह काम नहीं करेगा तो मुझे बताएं। मैं इसे एक मौजूदा ऐप के लिए बना रहा हूं। सभी को धन्यवाद।

+0

हे! बहुत बढ़िया जवाब! यह मुझे एक खुले प्रश्न के साथ छोड़ देता है: क्या प्रत्येक तिथि को फिर से शुरू किए बिना, आरंभ तिथि और अंत तक सभी तिथियों की गणना करने का एक तेज़ तरीका है? –

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