2009-07-07 15 views
9

मैं एक लाइब्रेरी प्रबंधन प्रणाली बना रहा हूं।मैं सी # में दो तिथियों के बीच, दिनों की संख्या, रविवार को कैसे गणना करूं?

मैंने डेट अंतर की गणना करने के लिए टाइमस्टैम्प का उपयोग किया है और डेट अंतर की सहायता से मैं ठीक से गणना कर रहा हूं।

अब इस तिथि के अंतर में एक सप्ताह में सभी दिन शामिल हैं। लेकिन पुस्तकालय आवेदन के लिए केवल सप्ताह में 6 दिनों (सोम - शनि) के लिए शुल्क लिया जाना चाहिए।

मैं ऐसा करने में सक्षम नहीं हूं।

क्या कोई इस काम को करने में मेरी मदद कर सकता है?

अग्रिम धन्यवाद !!

उत्तर

17

अनिवार्य रूप से, आप दिनों की कच्ची संख्या की गणना कर सकते हैं; आपको उस संख्या से घटाए जाने के लिए रविवार की संख्या को खोजने की जरूरत है। आप जानते हैं कि हर 7 दिन रविवार होता है, इसलिए आप अपने कच्चे दिनों की संख्या 7 से विभाजित कर सकते हैं, और उस संख्या को अपने कच्चे दिनों से घटा सकते हैं। अब आपको सप्ताह के शेष सप्ताह में रविवार की संख्या को हटाने की जरूरत है; दिन की कच्ची संख्या के मॉड आपको शेष दिनों बताएंगे। यह पता लगाने के लिए कि क्या उस अवधि में रविवार शामिल है, आपको पहले दिन के सप्ताह का दिन पता होना चाहिए; यदि आप सोमवार को 0 होने के लिए परिभाषित करते हैं, मंगलवार 1 होना, बुधवार 3 होना आदि, तो यदि आप अवधि की शुरुआत के सप्ताह के दिन के कच्चे संख्या के मॉड (7) में मूल्य जोड़ते हैं दिन, यदि संख्या 6 या उससे अधिक है, तो आपने एक अतिरिक्त रविवार को फैलाया है, और आपके ठीक नंबर से 1 दिन हटा देना चाहिए।

स्यूडोकोड में:

int fine; 
int numdays = endDay - startDay; 

fine = numdays - (numdays/7); 

int dayOfWeek = startDate.DayOfWeek; 
if (dayOfWeek + (numdays % 7) > 6) 
{ 
    fine = fine - 1; 
} 
+0

आपके उत्तर के लिए धन्यवाद। उत्कृष्ट स्पष्टीकरण क्या आप कोडिंग के माध्यम से प्रोग्रामेटिक रूप से स्पष्टीकरण का प्रतिनिधित्व कर सकते हैं? – sheetal

+0

जोड़ा स्यूडोकोड। –

8

यह यह करना होगा:

private int DaysLate(DateTime dueDate, DateTime returnDate) 
{ 
    var ts = returnDate - dueDate; 
    int dayCount = 0; 

    for (int i = 1; i <= ts.Days; i++) 
    { 
     if (dueDate.AddDays(i).DayOfWeek != DayOfWeek.Sunday) 
      dayCount++; 
    } 

    return dayCount; 
} 
+0

टाइमस्पैन/डेट क्लास का लाभ लेना निश्चित रूप से आईएमओ जाने का तरीका है। –

+2

अब तक का सबसे अच्छा जवाब। लेकिन: सामान्य रूप से, यह "डेटटाइम.अब" का उपयोग करने के लिए "गंध" है। उदाहरण के लिए, आप इस इकाई का परीक्षण कैसे करते हैं? ऐसा हो सकता है कि यूनिट परीक्षण से परिणाम मंगलवार से सोमवार को अलग हो। बेहतर, फिर, एक पैरामीटर जोड़ने के लिए उदा। "डेटटाइम लौटाया गया" और इस से देय दिनांक घटाएं। दूसरा, डेटटाइम से बहुत सावधान रहें.अब। यह टाइमज़ोन का खाता लेते हुए वर्तमान दिनांक और समय की गणना करता है। दिन की रोशनी बचत के समय में अजीब चीजें साल में दो बार हो सकती हैं। –

+0

@ जेरेमी: अच्छे अंक। मैंने आपके सुझाव के अनुसार फ़ंक्शन को संशोधित किया। – raven

1

इस जल्दी से परीक्षण किया और अपने उद्देश्यों के लिए काम करने के लिए लगता है: (संपादित करें: स्पष्टता के लिए कुछ टिप्पणियाँ जोड़ लिया है और कोड त्रुटि सही)

private static int CalculateDaysToFine(DateTime dateDue, DateTime dateIn) 
     { 
      TimeSpan ts = dateIn - dateDue; 
      int daysToFine = ts.Days - (ts.Days/7); //subtract full weeks (1 Sunday each) 
      if (((int)dateDue.DayOfWeek + (ts.Days%7)) >6) //check to see if the remaining days contain a Sunday 
       daysToFine--; 
      return daysToFine; 
     } 
+1

यदि मेरा उत्तर नीचे दिया जा रहा है, तो क्या कोई कम से कम एक कारण दे सकता है? जानना चाहते हैं कि यह क्यों काम नहीं करेगा। – Chuck

-2

मेरा लिंकी दृष्टिकोण (पढ़ने के लिए आसान होने का गुण है लेकिन एक मामूली पर्फ लेता है संरचना प्रकार की एक सूची बनाने का ormance हिट):

private int DaysLate(DateTime dateDue, DateTime dateReturned) 
{ 
    return getDayList(dateDue, dateReturned).Where(d => d.DayOfWeek != DayOfWeek.Sunday).Count(); 
} 

private List<DateTime> getDayList(DateTime begin, DateTime end) 
{ 
    List<DateTime> dates = new List<DateTime>(); 
    DateTime counter = begin; 
    while (counter <= end) 
    { 
     dates.Add(counter); 
     counter = counter.AddDays(1); 
    } 
    return dates; 
} 
+2

यह सभी उत्तरों का सबसे कम प्रदर्शन उदाहरण है। यह ओ (एन 2) है जहां एक साधारण गणित ऑपरेशन पर्याप्त होगा। –

+0

हाँ, मुझे zvolkov का जवाब बेहतर पसंद है। हालांकि, मैं डाउन-वोटिंग से बहुत प्रभावित नहीं हूं। पंक बच्चे –

2

याकूब Proffitt जवाब पर लेकिन इन-स्मृति सूची की भूमि के ऊपर बिना आधार पर। चूंकि DaysBetween गतिशील अपने दिनांकों पैदावार, गिनती गणना की जाती है के रूप में सूची उत्पन्न होता है:

private int DaysBetween(DateTime begin, DateTime end) 
{ 
    int count = 0; 
    for(var d = begin; d <= end; d.AddDays(1)) 
     if(d.DayOfWeek != DayOfWeek.Sunday) count++ 
    return count; 
} 
:

int c = DaysBetween(begin, end).Count(d => d.DayOfWeek != DayOfWeek.Sunday); 

private IEnumerable<DateTime> DaysBetween(DateTime begin, DateTime end) 
{ 
    for(var d = begin; d <= end; d.AddDays(1)) yield return d; 
} 
बेशक

आप इसे आसान बनाने में और एक समारोह के साथ जा सकते हैं LINQ दिखावे के लिए नहीं करना चाहता था, तो

आईएमएचओ ये दोनों स्वच्छ और आसान समझने, डीबग करने, समस्या निवारण, और सभी के पसंदीदा (रावेन के उत्तर) से संशोधित करने में आसान हैं।

बेशक, यह एक ओ (एन) समाधान है, जिसका अर्थ है कि दिन अलग हैं, जितना अधिक गणना करने में लगती है।

int q = end.Subtract(begin).Days - (end.Subtract(begin).Days/7); 
0

यहाँ मेरी दिया गया है: इस ठीक है असली दुनिया अनुप्रयोगों के अधिकांश, कुछ मामलों में आप इन पंक्तियों के साथ एक सूत्र-आधारित दृष्टिकोण, कुछ पसंद कर सकते हैं के लिए हो सकता है। मेरा लक्ष्य ओ (1) निष्पादन समय मैकवाफ्लेस्टिक्स के समान दृष्टिकोण का उपयोग कर था।मैंने इसे पढ़ने योग्य, ओओ कोड को अधिकतम करने और जितना संभव हो सके "गणित जादू" को कम करने की कोशिश की (नहीं कि मेरे पास गणित के खिलाफ कुछ भी है ... या उस मामले के लिए जादू)।

विचार यह है कि तिथि को सही करने के लिए नियत तारीख और लौटाई गई तारीख के बीच 7 दिनों के सप्ताह और "डेल्टा" दिनों की संख्या निर्धारित करने के लिए यह निर्धारित किया जाए। जब तक आप गारंटी दे सकते हैं कि न तो देय तिथि और न ही लौटाई गई तारीख रविवार को गिरती है (जो मैं आपके विवरण से मानता हूं वह कोई समस्या नहीं होगी) यह अपेक्षा के अनुसार काम करेगा।

 
     static int CalculateFineDays(DateTime due, DateTime returned) 
     { 
      TimeSpan ts = returned - due; 
      if (ts < TimeSpan.Zero) 
       return 0;
int delta = returned.DayOfWeek - due.DayOfWeek; return delta + ts.Subtract(TimeSpan.FromDays(delta)).Days * 6/7; }

संपादित करें: मैं एक समाधान पहले उत्पन्न किया था और उस में एक बग मिला है, और के रूप में मैं इस पर काम कर रहा था कि मैं इस के लिए नीचे कोड कम कर दिया।

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

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