-
Notifications
You must be signed in to change notification settings - Fork 0
/
WeekdayHoliday.cs
48 lines (42 loc) · 2.21 KB
/
WeekdayHoliday.cs
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesignCrowd_Task
{
// Holiday that occurs on a fixed date except if that date falls on a weekend
// in which case it moves to the following Monday
internal class WeekdayHoliday : PublicHoliday
{
public WeekdayHoliday(int month, int day)
: base((DateTime start, DateTime end) =>
{
// We assume each full calendar year has exactly one instance of the holiday
int fullYearsBetween = end.Year - start.Year > 1 ? end.Year - start.Year - 1 : 0;
DateTime holidayInStartYear = new DateTime(start.Year, month, day);
if (holidayInStartYear.DayOfWeek == DayOfWeek.Saturday)
holidayInStartYear = holidayInStartYear.AddDays(2);
else if (holidayInStartYear.DayOfWeek == DayOfWeek.Sunday)
holidayInStartYear = holidayInStartYear.AddDays(1);
DateTime holidayInEndYear = new DateTime(end.Year, month, day);
if (holidayInEndYear.DayOfWeek == DayOfWeek.Saturday)
holidayInEndYear = holidayInEndYear.AddDays(2);
else if (holidayInEndYear.DayOfWeek == DayOfWeek.Sunday)
holidayInEndYear = holidayInEndYear.AddDays(1);
// Check that the year hasn't rolled over to next year and the holiday is in the range
int additionalHolidaysAfterStart = holidayInStartYear.Year == start.Year &&
holidayInStartYear > start && holidayInStartYear < end ? 1 : 0;
int additionalHolidaysBeforeEnd = holidayInEndYear.Year == end.Year &&
holidayInEndYear > start && holidayInEndYear < end ? 1 : 0;
int totalHolidays;
if (start.Year != end.Year)
totalHolidays = fullYearsBetween + additionalHolidaysAfterStart + additionalHolidaysBeforeEnd;
else
totalHolidays = fullYearsBetween + additionalHolidaysAfterStart;
return totalHolidays;
})
{
}
}
}