2011-05-26 73 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 
相关问题