2011-05-26 79 views
5

可能重複:
How to find the 3rd Friday in a month with C#?如何在C#計算出每月的第二個星期五

大家好,

我已經寫了一個小控制檯實用工具,吐出線成文本文件。我希望這一行包含當前月份的第二個星期五。有沒有辦法做到這一點?

謝謝大家!

+1

我掛的問題基本上是同樣的問題。用'DateTime.Now'替換'yourDate'並用8替換15。 – Brandon 2011-05-26 14:18:56

+0

我看了一下。它真的很健壯嗎? – 2011-05-26 14:21:09

+0

是的,應該是 – 2011-05-26 14:23:07

回答

10

稍有不同的@druttka:使用擴展方法。

public static DateTime NthOf(this DateTime CurDate, int Occurrence , DayOfWeek Day) 
{ 
    var fday = new DateTime(CurDate.Year, CurDate.Month, 1); 

    var fOc = fday.DayOfWeek == Day ? fday : fday.AddDays(Day - fday.DayOfWeek); 
    // CurDate = 2011.10.1 Occurance = 1, Day = Friday >> 2011.09.30 FIX. 
    if (fOc.Month < CurDate.Month) Occurrence = Occurrence+1; 
    return fOc.AddDays(7 * (Occurrence - 1)); 
} 

然後把它稱爲是這樣的:

for (int i = 1; i < 13; i++) 
{ 
     Console.WriteLine(new DateTime(2011, i,1).NthOf(2, DayOfWeek.Friday)); 
} 
+0

+1但IMO'fOc'是錯誤的變量名稱。我不得不去想'fOc'代表什麼?我知道了,但浪費了幾秒鐘。由於我們閱讀的代碼比我們編寫的代碼更多,所以我認爲最好把它拼出來。 – User 2013-09-11 20:46:07

+0

可能的錯誤:看起來像(fOc.Month User 2013-09-11 20:59:59

0

未經測試,但應該抓住它。

DateTime today = DateTime.Today; 
DateTime secondFriday = 
    Enumerable.Range(8, 7) 
       .Select(item => new DateTime(today.Year, today.Month, item)) 
       .Where(date => date.DayOfWeek == DayOfWeek.Friday) 
       .Single(); 
0

我會去做這樣的事情。

public static DateTime SecondFriday(DateTime currentMonth) 
    { 
     var day = new DateTime(currentMonth.Year, currentMonth.Month, 1); 
     day = FindNext(DayOfWeek.Friday, day); 
     day = FindNext(DayOfWeek.Friday, day.AddDays(1)); 
     return day; 
    } 

    private static DateTime FindNext(DayOfWeek dayOfWeek, DateTime after) 
    { 
     DateTime day = after; 
     while (day.DayOfWeek != dayOfWeek) day = day.AddDays(1); 
     return day; 
    } 
0

完全測試:

for (int mo = 1; mo <= 12; mo++) 
{ 
    DateTime _date = new DateTime(yr, mo, 1); 
    DayOfWeek day = _date.DayOfWeek; 

    int d = 0; 
    if (day == DayOfWeek.Saturday) 
     d += 7; 

    var diff = DayOfWeek.Friday - day; 

    DateTime secFriday = _date.AddDays(diff + 7 + d); 
    Console.WriteLine(secFriday.ToString("MM\tddd\tdd")); 
} 

最終結果:

Month   Date 
===================== 
01  Fri  14 
02  Fri  11 
03  Fri  11 
04  Fri  08 
05  Fri  13 
06  Fri  10 
07  Fri  08 
08  Fri  12 
09  Fri  09 
10  Fri  14 
11  Fri  11 
12  Fri  09 
相關問題