-
Notifications
You must be signed in to change notification settings - Fork 0
/
DayIndexHoliday.cs
59 lines (50 loc) · 2.35 KB
/
DayIndexHoliday.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
49
50
51
52
53
54
55
56
57
58
59
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesignCrowd_Task
{
internal class DayIndexHoliday : PublicHoliday
{
private static DateTime FindHolidayInYear(int year, int month, DayOfWeek dayOfWeek, int dayIndex)
{
DateTime holidayInYear = new DateTime(year, month, 1);
int foundDaysInStartYear = 0;
while (true)
{
if (holidayInYear.DayOfWeek == dayOfWeek)
foundDaysInStartYear++;
if (foundDaysInStartYear < dayIndex)
holidayInYear = holidayInYear.AddDays(1);
else
break;
}
return holidayInYear;
}
// For holidays on the {dayIndex}'th {dayOfWeek} in {month}
// dayIndex is 1 indexes - ie. the second Monday would have dayIndex = 2
public DayIndexHoliday(int month, DayOfWeek dayOfWeek, int dayIndex)
: 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 = FindHolidayInYear(start.Year, month, dayOfWeek, dayIndex);
DateTime holidayInEndYear = FindHolidayInYear(end.Year, month, dayOfWeek, dayIndex);
// 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;
})
{
}
}
}