2008-11-13 8 views
17

यह है कि मैं क्या करने की कोशिश कर रहा हूं: एक तिथि, सप्ताह का एक दिन, और एक पूर्णांक n, यह निर्धारित करता है कि तिथि n महीने का दिन है या नहीं।मैं कैसे निर्धारित करूं कि दी गई तारीख महीने का एनएच सप्ताह का दिन है या नहीं?

उदाहरण के लिए:

  • 1/1/2009,Monday,2 के इनपुट झूठी होगा क्योंकि 1/1/2009 नहीं है दूसरे सोमवार

  • इनपुट 11/13/2008,Thursday,2 सच वापसी होगी क्योंकि यह दूसरे गुरुवार

  • है की

मैं इस कार्यान्वयन में सुधार कैसे कर सकता हूं?

private bool NthDayOfMonth(DateTime date, DayOfWeek dow, int n) 
{ 
    int d = date.Day; 
    return date.DayOfWeek == dow && (d/ 7 == n || (d/ 7 == (n - 1) && d % 7 > 0)); 
} 

उत्तर

12

सप्ताह के चेक को बदल सकता है तो समारोह में लिखा होगा:

private bool NthDayOfMonth(DateTime date, DayOfWeek dow, int n){ 
    int d = date.Day; 
    return date.DayOfWeek == dow && (d-1)/7 == (n-1); 
} 

उसके अलावा, यह बहुत अच्छा और कुशल लग रहा है।

1

Here एमएसडीएन को क्या कहना है। इसका वीबी, लेकिन यह आसानी से अनुवाद करता है।

+0

कि थोडा मुझे – Kevin

8

उत्तर this website से है। यदि साइट कभी खो जाती है तो यहां कॉपी/पेस्ट किया गया है।

public static DateTime FindTheNthSpecificWeekday(int year, int month,int nth, System.DayOfWeek day_of_the_week) 
{ 
    // validate month value 
    if(month < 1 || month > 12) 
    { 
     throw new ArgumentOutOfRangeException("Invalid month value."); 
    } 

    // validate the nth value 
    if(nth < 0 || nth > 5) 
    { 
     throw new ArgumentOutOfRangeException("Invalid nth value."); 
    } 

    // start from the first day of the month 
    DateTime dt = new DateTime(year, month, 1); 

    // loop until we find our first match day of the week 
    while(dt.DayOfWeek != day_of_the_week) 
    { 
     dt = dt.AddDays(1); 
    } 

    if(dt.Month != month) 
    { 
     // we skip to the next month, we throw an exception 
     throw new ArgumentOutOfRangeException(string.Format("The given month has less than {0} {1}s", nth, day_of_the_week)); 
    } 

    // Complete the gap to the nth week 
    dt = dt.AddDays((nth - 1) * 7); 

    return dt; 
} 
+0

के विपरीत करता है जो यह – Kevin

+0

के विपरीत भी करता है चाहे यह वास्तव में केविन की आवश्यकता हो, यह मुझे बहुत जरूरी था। इसे पोस्ट करने के लिए धन्यवाद। –

+0

वैध महीनों के लिए चेक दिन जोड़े जाने के बाद किया जाना चाहिए। अगर (डीटी.मोन्थ! = माह) महीने के पहले सप्ताह के बाद हमेशा सत्य होता है – SQueek

1

यह किसी दिए गए दिनांक के लिए भाषा आपूर्ति दिनांक/दिन विधियों की तरह दिखता है। अगर कोई दिलचस्पी लेता है तो आप Zeller's congruence पढ़ सकते हैं।

मुझे नहीं लगता कि वे यही चाहते हैं कि आप ऐसा करना चाहते हैं लेकिन आप उस महीने के पहले दिन के सप्ताह का दिन पा सकते हैं। अब जब मैंने इसके बारे में सोचा था तो आपको N के रूप में दिए गए दिन के लिए सप्ताह का दिन मिल सकता है और उस मॉड्यूल 7 को प्राप्त कर सकते हैं।

ओह रुको, क्या सप्ताह के एक दिन (जैसे रविवार) की तरह एनएच मौका एनएच सप्ताह के महीने! ठीक है मैं उदाहरण देखता हूँ।

शायद यह इस तरह के एक महीने की 1 के रूप में एक फर्क होता अगर आप एक तिथि का निर्माण कर सकता है ..

यह देखते हुए कि यह सप्ताह के एक दिन के वां घटना है, और है कि आप नहीं कर सकते जो भी डेटाटाइम डेटाटाइप के साथ बेवकूफ़ है, और आपके पास सप्ताह के दिन के दिन तक पहुंच है और महीने के कार्यों का दिन मिलता है। क्या रविवार शून्य होगा?

1) सबसे पहले, सप्ताह के दिन को दिए गए सप्ताह के दिन से मेल खाना पड़ेगा।
2) एन कम से कम 1 और 4 पर होना चाहिए।
3) महीने का दिन एन * 7 * दिनऑफविक + 1 और एन * 7 * दिन ओफवीक +6 के बीच एक ही एन के लिए होगा।
- मुझे इसके बारे में सोचने दो। अगर रविवार पहला था .. 0 * 7 * 0 + 1 = 1 और शनिवार 6 वां 0 * 7 * 0 + 6 होगा।

ऊपर सोचें 1 और 3 ऊपर पर्याप्त हैं क्योंकि माह के एक दिन के दिन का उल्लंघन नहीं करना चाहिए।

(* first try, this code sucks *) 

function isNthGivenDayInMonth(date : dateTime; 
           dow : dayOfWeek; 
           N : integer) : boolean; 
    var B, A : integer (* on or before and after day of month *) 
    var Day : integer (* day of month *) 
    begin 
    B := (N-1)*7 + 1; A := (N-1)*7 + 6; 
    D := getDayOfMonth(date); 
    if (dow <> getDayOfWeek(date) 
     then return(false) 
     else return((B <= Day) and (A >= Day)); 
    end; (* function *) 

आशा है कि उस लॉल में कोई बग नहीं है!
[संपादित करें: शनिवार 7 होता है, और ऊपरी (N-1)*7 + 7 ऊपर बंधे।]
आपका समाधान लगता है कि यह 2 अलग सप्ताह से मेल होगा? ऐसा लगता है कि यह हमेशा रविवार के लिए शून्य वापस आ जाएगा? सी # में छद्म कोड किया जाना चाहिए .. शॉर्ट सर्किट & & मेरी तरह है .. हे रविवार को शुरू होने वाले महीनों में एन = 1 के लिए रविवार को पहला मैच नहीं होना चाहिए?

d/ 7 == n 

कि (either 0 or 1)/7 == 1 में परिणाम होगा, यह सही नहीं हो सकता! आपके ||(n-1) को भी पकड़ता है, रॉबर्ट के पास है। रॉबर्ट वाग्नेर के जवाब के साथ जाओ! यह केवल 2 लाइनें है, कम अच्छा है! (Day-1) mod 7
[संपादित करें: (Day-1) div 7] मेरे अनावश्यक चर और सेटअप की 2 लाइनों को समाप्त करता है।

रिकॉर्ड के लिए यह सीमा मामलों के लिए जांच की जानी चाहिए और आगे की तरह अगर 31 अगस्त रविवार या शनिवार था।
[संपादित करें: सप्ताह के अंत के अंत में भी जांच करनी चाहिए थी। ! क्षमा करें]

0

this answer में, निम्न कोड फ़्लिप करने की आवश्यकता है:

// Complete the gap to the nth week 
dt = dt.AddDays((nth - 1) * 7); 

if(dt.Month != month) 
{ 
// we skip to the next month, we throw an exception 
throw new ArgumentOutOfRangeException(”The given month has less than ” nth.ToString() ” ” 
day_of_the_week.ToString() “s”); 
} 
0

ऊपर जवाब में से अधिकांश को आंशिक रूप से सही या अनावश्यक रूप से जटिल कर रहे हैं। आप इस सरल कार्य को आजमा सकते हैं, जो यह भी जांचता है कि दी गई तारीख महीने का आखिरी लेकिन एनएच दिन है या नहीं।

public static bool IsNthDayofMonth(this DateTime date, DayOfWeek weekday, int N) 
    { 
     if (N > 0) 
     { 
      var first = new DateTime(date.Year, date.Month, 1); 
      return (date.Day - first.Day)/ 7 == N - 1 && date.DayOfWeek == weekday; 
     } 
     else 
     { 

      var last = new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1); 
      return (last.Day - date.Day)/7 == (Math.Abs(N) - 1) && date.DayOfWeek == weekday; 
     } 
0

मामले में आप समय के अंतराल के लिए तारीखों की एक सूची चाहते हैं (न कि सिर्फ एक) एक महीने के वां सप्ताह का दिन के लिए, तो आप इस का उपयोग कर सकते हैं:

internal static List<DateTime> GetDatesForNthDOWOfMonth(int weekNum, DayOfWeek DOW, DateTime beginDate, DateTime endDate) 
{ 
    List<DateTime> datesForNthDOWOfMonth = new List<DateTime>(); 
    int earliestDayOfMonth = 1; 
    int latestDayOfMonth = 7; 
    DateTime currentDate = beginDate; 

    switch (weekNum) 
    { 
     case 1: 
      earliestDayOfMonth = 1; 
      latestDayOfMonth = 7; 
      break; 
     case 2: 
      earliestDayOfMonth = 8; 
      latestDayOfMonth = 14; 
      break; 
     case 3: 
      earliestDayOfMonth = 15; 
      latestDayOfMonth = 21; 
      break; 
     case 4: 
      earliestDayOfMonth = 22; 
      latestDayOfMonth = 28; 
      break; 
    } 

    while (currentDate < endDate) 
    { 
     DateTime dateToInc = currentDate; 
     DateTime endOfMonth = new DateTime(dateToInc.Year, dateToInc.Month, DateTime.DaysInMonth(dateToInc.Year, dateToInc.Month)); 
     bool dateFound = false; 
     while (!dateFound) 
     { 
      dateFound = dateToInc.DayOfWeek.Equals(DOW); 
      if (dateFound) 
      { 
       if ((dateToInc.Day >= earliestDayOfMonth) && 
        (dateToInc.Day <= latestDayOfMonth)) 
       { 
        datesForNthDOWOfMonth.Add(dateToInc); 
       } 
      } 
      if (dateToInc.Date.Equals(endOfMonth.Date)) continue; 
      dateToInc = dateToInc.AddDays(1); 
     } 
     currentDate = new DateTime(currentDate.Year, currentDate.Month, 1); 
     currentDate = currentDate.AddMonths(1); 
    } 
    return datesForNthDOWOfMonth; 
} 

... और कॉल यह इस तरह से:

// This is to get the 1st Monday in each month from today through one year from today 
DateTime beg = DateTime.Now; 
DateTime end = DateTime.Now.AddYears(1); 
List<DateTime> dates = GetDatesForNthDOWOfMonth(1, DayOfWeek.Monday, beg, end); 
// To see the list of dateTimes, for verification 
foreach (DateTime d in dates) 
{ 
    MessageBox.Show(string.Format("Found {0}", d.ToString())); 
} 

तुम इतनी तरह प्रत्येक माह के 2 रे शुक्रवार मिल सकता है:

List<DateTime> dates = GetDatesForNthDOWOfMonth(2, DayOfWeek.Friday, beg, end); 

... आदि।

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