指定された 2 つの日付を反復処理して曜日を数えるのではなく、その日付間の曜日数を取得するにはどうすればよいでしょうか。
かなり簡単そうに思えますが、以下の条件を満たす決定的な正解を見つけることができないようです。
- 合計には月曜日から金曜日までが含まれる必要があるため、GetNumberOfWeekdays(new DateTime(2009,11,30), new DateTime(2009,12,4)) は 5 になり、月曜日から金曜日までになります。
- 閏日を考慮する必要がある
- 平日をカウントしながら、その間のすべての日付を単に反復するわけではありません。
ベストアンサー1
O(1)解:
// Count days from d0 to d1 inclusive, excluding weekends
public static int countWeekDays(DateTime d0, DateTime d1)
{
int ndays = 1 + Convert.ToInt32((d1 - d0).TotalDays);
int nsaturdays = (ndays + Convert.ToInt32(d0.DayOfWeek)) / 7;
return ndays - 2 * nsaturdays
- (d0.DayOfWeek == DayOfWeek.Sunday ? 1 : 0)
+ (d1.DayOfWeek == DayOfWeek.Saturday ? 1 : 0);
}
2014 年 1 月の例:
January 2014
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
countWeekDays(new DateTime(2014, 1, 1), new DateTime(2014, 1, 1)); // 1
countWeekDays(new DateTime(2014, 1, 1), new DateTime(2014, 1, 2)); // 2
countWeekDays(new DateTime(2014, 1, 1), new DateTime(2014, 1, 3)); // 3
countWeekDays(new DateTime(2014, 1, 1), new DateTime(2014, 1, 4)); // 3
countWeekDays(new DateTime(2014, 1, 1), new DateTime(2014, 1, 5)); // 3
countWeekDays(new DateTime(2014, 1, 1), new DateTime(2014, 1, 6)); // 4
注意:DateTime
入力は、1 日のほぼ同じ時間にする必要があります。DateTime
上記の例のように、年、月、日のみに基づいてオブジェクトを作成する場合は、問題ありません。反対の例として、1 月 1 日の午前 12:01 から 1 月 2 日の午後 11:59 までは 2 日間しかありませんが、上記の関数では、これらの時間を使用すると 3 日間としてカウントされます。