Используйте следующий метод расширения:
public static class DateTimeExtensions
{
///<summary>Gets the first week day following a date.</summary>
///<param name="date">The date.</param>
///<param name="dayOfWeek">The day of week to return.</param>
///<returns>The first dayOfWeek day following date, or date if it is on dayOfWeek.</returns>
public static DateTime Next(this DateTime date, DayOfWeek dayOfWeek) {
return date.AddDays((dayOfWeek < date.DayOfWeek ? 7 : 0) + dayOfWeek - date.DayOfWeek);
}
}
Затем вы можете написать
new DateTime(2010, 07, 01).Next(DayOfWeek.Monday).AddDays((2 - 1) * 7);
Или как функцию:
public DateTime GetNthWeekofMonth(DateTime date, int nthWeek, DayOfWeek dayOfWeek) {
return date.Next(dayOfWeek).AddDays((nthWeek - 1) * 7);
}
(Мне нужно вычесть единицу, потому что date.Next (dayOfWeek)
уже является первое появление этого дня)
Один из возможных алгоритмов:
IEnumerable<DateTime> WeekdaysFrom( DateTime start )
{
DateTime weekday = start.Add( TimeSpan.FromDays(1) );
while( weekday < DateTime.MaxValue.Subtract( TimeSpan.FromDays(1) ) )
{
while( weekday.DayOfWeek == DayOfWeek.Saturday || weekday.DayOfWeek == DayOfWeek.Sunday )
{
weekday.Add( TimeSpan.FromDays(1) );
}
yield return weekday;
}
}
DateTime NthWeekday( DateTime month, int n )
{
return WeekdaysFrom( new DateTime( month.year, month.month, 1 ) ).Skip(n-1).First();
}
Дубликат можно найти здесь: Как определить, является ли заданная дата N-м будним днем месяца?
int d = date.Day;
return date.DayOfWeek == dow && (d-1)/7 == (n-1);