108 lines
4.4 KiB
C#
108 lines
4.4 KiB
C#
using System;
|
|
using System.Linq;
|
|
|
|
namespace AdvertsingProfitControl
|
|
{
|
|
internal class Holiday
|
|
{
|
|
public static Holidays IsHoliday(DateTime date)
|
|
{
|
|
if(IsNewYearsDay(date) == Holidays.NewYearsDay) return Holidays.NewYearsDay;
|
|
if(IsFourthOfJuly(date) == Holidays.FourthOfJuly) return Holidays.FourthOfJuly;
|
|
if(IsThanksgivingDay(date) == Holidays.Thanksgiving) return Holidays.Thanksgiving;
|
|
return IsChristmasDay(date) == Holidays.Christmas ? Holidays.Christmas : Holidays.NoHoliday;
|
|
}
|
|
public static Holidays IsNewYearsEve(DateTime date)
|
|
{
|
|
return date.DayOfYear == AdjustForWeekendHoliday(new DateTime(date.Year, 12, 31)).DayOfYear ? Holidays.NewYearsEve : Holidays.NoHoliday;
|
|
}
|
|
public static Holidays IsNewYearsDay(DateTime date)
|
|
{
|
|
return date.DayOfYear == AdjustForWeekendHoliday(new DateTime(date.Year, 1, 1)).DayOfYear ? Holidays.NewYearsDay : Holidays.NoHoliday;
|
|
}
|
|
public static Holidays IsMemorialDay(DateTime date)
|
|
{ //Last Monday in May
|
|
var memorialDay = new DateTime(date.Year, 5, 31);
|
|
var dayOfWeek = memorialDay.DayOfWeek;
|
|
while (dayOfWeek != DayOfWeek.Monday)
|
|
{
|
|
memorialDay = memorialDay.AddDays(-1);
|
|
dayOfWeek = memorialDay.DayOfWeek;
|
|
}
|
|
return date.DayOfYear == memorialDay.DayOfYear ? Holidays.MemorialDay : Holidays.NoHoliday;
|
|
}
|
|
public static Holidays IsFourthOfJuly(DateTime date)
|
|
{
|
|
return date.DayOfYear == AdjustForWeekendHoliday(new DateTime(date.Year, 7, 4)).DayOfYear ? Holidays.FourthOfJuly : Holidays.NoHoliday;
|
|
}
|
|
public static Holidays IsLaborDay(DateTime date)
|
|
{ // First Monday in September
|
|
var laborDay = new DateTime(date.Year, 9, 1);
|
|
var dayOfWeek = laborDay.DayOfWeek;
|
|
while (dayOfWeek != DayOfWeek.Monday)
|
|
{
|
|
laborDay = laborDay.AddDays(1);
|
|
dayOfWeek = laborDay.DayOfWeek;
|
|
}
|
|
return date.DayOfYear == laborDay.DayOfYear ? Holidays.LaborDay : Holidays.NoHoliday;
|
|
}
|
|
public static Holidays IsThanksgivingDay(DateTime date)
|
|
{//4th Thursday in November
|
|
var thanksgiving = (from day in Enumerable.Range(1, 30)
|
|
where new DateTime(date.Year, 11, day).DayOfWeek == DayOfWeek.Thursday
|
|
select day).ElementAt(3);
|
|
var thanksgivingDay = new DateTime(date.Year, 11, thanksgiving);
|
|
return date.DayOfYear == thanksgivingDay.DayOfYear ? Holidays.Thanksgiving : Holidays.NoHoliday;
|
|
}
|
|
public static Holidays IsChristmasEve(DateTime date)
|
|
{
|
|
return date.DayOfYear == AdjustForWeekendHoliday(new DateTime(date.Year, 12, 24)).DayOfYear ? Holidays.ChristmasEve : Holidays.NoHoliday;
|
|
}
|
|
public static Holidays IsChristmasDay(DateTime date)
|
|
{
|
|
return date.DayOfYear == new DateTime(date.Year, 12, 25).DayOfYear ? Holidays.Christmas : Holidays.NoHoliday;
|
|
}
|
|
private static DateTime AdjustForWeekendHoliday(DateTime holiday)
|
|
{
|
|
switch (holiday.DayOfWeek)
|
|
{
|
|
case DayOfWeek.Saturday:
|
|
return holiday.AddDays(-1);
|
|
case DayOfWeek.Sunday:
|
|
return holiday.AddDays(1);
|
|
}
|
|
return holiday;
|
|
}
|
|
|
|
//Source: http://stackoverflow.com/questions/2510383/how-can-i-calculate-what-date-good-friday-falls-on-given-a-year
|
|
public static DateTime EasterSunday(int year)
|
|
{
|
|
var g = year % 19;
|
|
var c = year / 100;
|
|
var h = (c - c / 4 - (8 * c + 13) / 25 + 19 * g + 15) % 30;
|
|
var i = h - h / 28 * (1 - h / 28 * (29 / (h + 1)) * ((21 - g) / 11));
|
|
|
|
var day = i - ((year + year / 4 + i + 2 - c + c / 4) % 7) + 28;
|
|
var month = 3;
|
|
|
|
if (day <= 31) return new DateTime(year, month, day);
|
|
month++;
|
|
day -= 31;
|
|
|
|
return new DateTime(year, month, day);
|
|
}
|
|
}
|
|
public enum Holidays
|
|
{
|
|
NoHoliday = 0,
|
|
NewYearsEve = 1,
|
|
NewYearsDay = 2,
|
|
MemorialDay = 3,
|
|
FourthOfJuly = 4,
|
|
LaborDay = 5,
|
|
Thanksgiving = 6,
|
|
ChristmasEve = 7,
|
|
Christmas = 8
|
|
}
|
|
}
|