问题描述
||
这个问题已经在这里有了答案:
解决方法
@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));
}
,我会去这样的事情。
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;
}
,未经测试,但这应该抓住它。
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();
,经过全面测试:
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