2010-04-26 48 views
5

的我,從一個日期範圍用途的功能如何獲得上週五使用一個月(縣).NET

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; 
} 

的返回我只有週五的函數:「從日期列表直到StartDate指定的星期數,即如果startdate是2010年4月23日,星期數是1,那麼程序應該返回從2010年4月16日到開始日期的日期「。

我打電話的功能:

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

現在的要求已經改變了一點。我只需要找出每個月的最後一個星期五。 該函數的輸入將保持不變。

+0

@Newbie:C#的版本很重要,但也是.NET的版本,因爲C#本身無法幫助您 - 您需要.NET Framework。 – 2010-04-26 05:59:52

+0

這是你的功課嗎? – 2010-04-26 06:41:13

+0

更習慣的實現將使用'IEnumerable '而不是將所有內容都轉換爲'List '。 – 2010-04-26 06:42:36

回答

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

爲什麼在這裏使用DateTime.MaxValue? – ColinM 2016-12-28 12:11:21

+0

@ColinM它似乎被用作常量。這與'while(true){...}'是一樣的,雖然看起來很笨重。它還包含一個不必要的檢查,以確定值是否已更改。 – 2017-11-07 12:40:08

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; 
} 
相關問題