Получить n-й день недели в С#

Возможный дубликат:
Как определить, является ли данная дата N-ым днем ​​недели?

Как я могу получить n-й рабочий день месяца?

Например:

2-й понедельник "Июль 2010" = 07/12/2010.

Ищете функцию вроде:

public DateTime GetNthWeekofMonth(DateTime date, int nthWeek, DayOfWeek dayofWeek)
{
//return the date of nth week of month
}

из вышеизложенного, параметры функции будут ( "Любая дата в июле 2010 года", 2, понедельник).

Ответ 1

Используйте следующий метод расширения:

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) уже первое вхождение этого дня)

Ответ 2

Один возможный алгоритм:

  • Начните с 1-го числа месяца.
  • Перемещение вперед один день за раз до вы получаете День недели, вы находясь в поиске.
  • Добавить (7 * N) до даты, когда вы на получите нужную дату.

Ответ 4

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