12

重複の可能性:
特定の日付がその月の N 番目の平日かどうかを判断するにはどうすればよいですか?

月のn番目の平日を取得するにはどうすればよいですか?

例:

「2010 年 7 月」の第 2 月曜日 = 2010 年 7 月 12 日。

次のような関数を探しています。

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

上記から、関数のパラメーターは ("2010 年 7 月の任意の日付", 2, 月曜日) になります。

4

4 に答える 4

24

次の拡張メソッドを使用します。

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)(すでにその日の最初の出現であるため、1を引く必要があります)

于 2010-07-19T19:51:26.370 に答える
3

考えられるアルゴリズムの 1 つ:

  1. 月の1日から始めます。
  2. 探している曜日になるまで、1 日ずつ進めます。
  3. 希望する日付を取得するには、現在の日付に (7 * N) を追加します。
于 2010-07-19T19:49:51.677 に答える
0

重複はここにあります:特定の日付が月の N 番目の平日であるかどうかを確認するにはどうすればよいですか?

int d = date.Day; 
return date.DayOfWeek == dow && (d-1)/7 == (n-1); 
于 2010-07-19T19:49:58.977 に答える
0
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();
}
于 2010-07-19T19:57:27.730 に答える