O (1) Roztwór:
// 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);
}
Przykłady stycznia 2014 r
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
N.B. Wejścia DateTime
powinny znajdować się mniej więcej o tej samej porze dnia. Jeśli tworzysz obiekty DateTime
oparte wyłącznie na roku, miesiącu i dniu, jak w powyższych przykładach, powinieneś być w porządku. Jako przykład przykrościowy, 12:01 od 1 stycznia do 23:59 Jan 2 obejmuje tylko 2 dni, ale powyższa funkcja będzie liczyć 3, jeśli użyjesz tych czasów.
Czy chcesz wykluczyć tylko soboty i niedziele, czy też wziąć pod uwagę dni świąteczne? –
nodobime, być może? –
Tylko w soboty i niedziele. Stworzę osobną metodę GetNumberOfBusinessDays (DateTime from, DateTime to, IEnumerable), która oprócz listy wykluczeń obejmie wykluczenie dni wolnych od pracy. –