2010-04-26 12 views
5

के अंतिम शुक्रवार को पाने के लिए मैं एक समारोह है कि दिनांककैसे महीने (रों) का उपयोग कर नेट

public static List<DateTime> GetDates(DateTime startDate, int weeks) 
{ 
    int days = weeks * 7; 

    //Get the whole date range 
    List<DateTime> dtFulldateRange = Enumerable.Range(-days, days).Select(i => startDate.AddDays(i)).ToList(); 

    //Get only the fridays from the date range 
    List<DateTime> dtOnlyFridays = (from dtFridays in dtFulldateRange 
            where dtFridays.DayOfWeek == DayOfWeek.Friday 
            select dtFridays).ToList(); 
    return dtOnlyFridays; 
} 

समारोह का उद्देश्य की एक सीमा से वापस मुझे केवल शुक्रवार: "से तिथियों की सूची स्टार्टडेट से निर्दिष्ट सप्ताह संख्या यानी यदि स्टार्टडेट 23 अप्रैल, 2010 है और सप्ताह संख्या 1 है, तो कार्यक्रम को 16 अप्रैल, 2010 से शुरुआत शुरू होने तक तिथियां वापस करनी चाहिए "।

मैं समारोह बोल रहा हूँ के रूप में:

DateTime StartDate1 = DateTime.ParseExact("20100430", "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture); 
List<DateTime> dtList = Utility.GetDates(StartDate1, 4).ToList(); 

अब आवश्यकता थोड़ा बदल गया है। मुझे हर महीने केवल अंतिम शुक्रवार को खोजने की जरूरत है। फ़ंक्शन में इनपुट समान रहेगा।

+0

@Newbie: सी # का संस्करण महत्वपूर्ण है, लेकिन .NET का संस्करण भी है, क्योंकि सी # स्वयं ही आपकी मदद नहीं कर सकता - आपको .NET Framework की आवश्यकता है। –

+0

क्या यह आपका होमवर्क है? –

+0

एक और बेवकूफ कार्यान्वयन 'सूची ' में सबकुछ परिवर्तित करने के बजाय 'IENumerable ' का उपयोग करेगा। –

उत्तर

6

आपके पास पहले से ही दी गई सीमा में शुक्रवार की सूची है। अब बस इस तरह से पूछें:

List<DateTime> lastFridays = (from day in fridays 
           where day.AddDays(7).Month != day.Month 
           select day).ToList<DateTime>(); 

आशा है कि इससे मदद मिलती है।

1

देखें कि अगले महीने के पहले दिन सप्ताह के किस दिन का दिन चल रहा है, फिर शुक्रवार को पर्याप्त दिन घटाएं।

या, यदि आपके पास पहले से ही शुक्रवार की एक सूची है, तो केवल उन लोगों को लौटाएं जिनके लिए 7 दिन जोड़ना अगले महीने में एक तारीख देता है।

4

यहां एक विस्तार विधि है जिसका हम उपयोग कर रहे हैं।

public static class DateTimeExtensions 
{ 
    public static DateTime GetLastFridayInMonth(this DateTime date) 
    { 
     var firstDayOfNextMonth = new DateTime(date.Year, date.Month, 1).AddMonths(1); 
     int vector = (((int)firstDayOfNextMonth.DayOfWeek + 1) % 7) + 1; 
     return firstDayOfNextMonth.AddDays(-vector); 
    } 
} 

नीचे MbUnit परीक्षण का मामला

[TestFixture] 
public class DateTimeExtensionTests 
{ 
    [Test] 
    [Row(1, 2011, "2011-01-28")] 
    [Row(2, 2011, "2011-02-25")] 
    ... 
    [Row(11, 2011, "2011-11-25")] 
    [Row(12, 2011, "2011-12-30")] 
    [Row(1, 2012, "2012-01-27")] 
    [Row(2, 2012, "2012-02-24")] 
    ... 
    [Row(11, 2012, "2012-11-30")] 
    [Row(12, 2012, "2012-12-28")] 

    public void Test_GetLastFridayInMonth(int month, int year, string expectedDate) 
    { 
    var date = new DateTime(year, month, 1); 
    var expectedValue = DateTime.Parse(expectedDate); 

    while (date.Month == month) 
    { 
     var result = date.GetLastFridayInMonth(); 
     Assert.AreEqual(expectedValue, result); 
     date = date.AddDays(1); 
    } 
    } 
} 
-1

कॉल पैरामीटर के रूप में की तारीख, जिसमें यह महीने और दिनांक पैरामीटर से साल निकालता है और इस बात का आखिरी Friday रिटर्न भेज कर नीचे समारोह है महीने

public DateTime GetLastFridayOfMonth(DateTime dt) 
{ 
     DateTime dtMaxValue = DateTime.MaxValue; 
     DateTime dtLastDayOfMonth = new DateTime(dt.Year, dt.Month, DateTime.DaysInMonth(dt.Year, dt.Month)); 

     while (dtMaxValue == DateTime.MaxValue) 
     { 
      // Returns if the decremented day is the fisrt Friday from last(ie our last Friday) 
      if (dtMaxValue == DateTime.MaxValue && dtLastDayOfMonth.DayOfWeek == DayOfWeek.Friday) 
       return dtLastDayOfMonth; 
      // Decrements last day by one 
      else 
       dtLastDayOfMonth = dtLastDayOfMonth.AddDays(-1.0); 
     } 
     return dtLastDayOfMonth; 
} 
+0

डेटटाइम का उपयोग क्यों करें। मैक्सवेल्यू यहाँ? – ColinM

+0

@ कोलिमिन यह एक स्थिर के रूप में इस्तेमाल किया प्रतीत होता है। यह वही (सच) {...} 'जैसा ही है, हालांकि बहुत गुस्सा लगता है। इसमें एक अनावश्यक जांच भी शामिल है कि मूल्य बदल गया है या नहीं। –

1

बस सरत के जवाब पर एक छोटा सा सुधार, उन (मेरे जैसे) ने इस प्रश्न में कदम के लिए

private DateTime GetLastFridayOfTheMonth(DateTime date) 
{ 
    var lastDayOfMonth = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month)); 

    while (lastDayOfMonth.DayOfWeek != DayOfWeek.Friday) 
     lastDayOfMonth = lastDayOfMonth.AddDays(-1); 

    return lastDayOfMonth; 
} 
संबंधित मुद्दे