-
Notifications
You must be signed in to change notification settings - Fork 84
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Add nyse holidays class * Add tests for nyse holidays * Reference NYSE Holidays
- Loading branch information
1 parent
d98c67d
commit 6fe0dbf
Showing
3 changed files
with
513 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,280 @@ | ||
using System; | ||
using System.Collections.Generic; | ||
|
||
namespace PublicHoliday | ||
{ | ||
/// <summary> | ||
/// Similar to Federal Holidays in the US | ||
/// If a holiday falls on a Saturday it is celebrated the preceding Friday; | ||
/// if a holiday falls on a Sunday it is celebrated the following Monday. | ||
/// https://www.nyse.com/markets/hours-calendars | ||
/// Note that this may not be historically accurate prior to 2022. | ||
/// This only captures what the current holiday set is and may not reflect historical holidays. | ||
/// </summary> | ||
/// <remarks> | ||
/// Recommendation to use cache with UseCachingHolidays for performance | ||
/// </remarks> | ||
public class USANewYorkStockExchangeHoliday : PublicHolidayBase | ||
{ | ||
|
||
#region Individual Holidays | ||
|
||
/// <summary> | ||
/// New Years Day. Note in 1999 and 2005 it was 31st December | ||
/// </summary> | ||
/// <param name="year">The year.</param> | ||
/// <returns></returns> | ||
public static Holiday NewYear(int year) | ||
{ | ||
var holiday = new DateTime(year, 1, 1); | ||
return new Holiday(holiday, HolidayCalculator.FixWeekendSaturdayBeforeSundayAfter(holiday), "NewYear"); | ||
} | ||
|
||
/// <summary> | ||
/// Third Monday in January | ||
/// </summary> | ||
/// <param name="year">The year.</param> | ||
/// <returns></returns> | ||
public static Holiday MartinLutherKing(int year) | ||
{ | ||
var hol = new DateTime(year, 1, 15); | ||
hol = HolidayCalculator.FindFirstMonday(hol); | ||
return new Holiday(hol, hol, "MartinLutherKing"); | ||
} | ||
|
||
/// <summary> | ||
/// Washington's Birthday aka Presidents Day. Third Monday in February | ||
/// </summary> | ||
/// <param name="year">The year.</param> | ||
/// <returns></returns> | ||
public static Holiday PresidentsDay(int year) | ||
{ | ||
var hol = new DateTime(year, 2, 15); | ||
hol = HolidayCalculator.FindFirstMonday(hol); | ||
return new Holiday(hol, hol, "PresidentsDay"); | ||
} | ||
|
||
/// <summary> | ||
/// Good Friday (Friday before Easter) Viernes Santo | ||
/// </summary> | ||
/// <param name="year"></param> | ||
/// <returns></returns> | ||
public static Holiday GoodFriday(int year) | ||
{ | ||
DateTime hol = HolidayCalculator.GetEaster(year); | ||
hol = hol.AddDays(-2); | ||
return new Holiday(hol, hol, "GoodFriday"); | ||
} | ||
|
||
/// <summary> | ||
/// Last Monday in May | ||
/// </summary> | ||
/// <param name="year">The year.</param> | ||
/// <returns></returns> | ||
public static Holiday MemorialDay(int year) | ||
{ | ||
var hol = new DateTime(year, 5, 25); | ||
hol = HolidayCalculator.FindFirstMonday(hol); | ||
return new Holiday(hol, hol, "MemorialDay"); | ||
} | ||
|
||
/// <summary> | ||
/// 19th June | ||
/// </summary> | ||
/// <param name="year">The year.</param> | ||
/// <returns></returns> | ||
public static Holiday Juneteenth(int year) | ||
{ | ||
var hol = new DateTime(year, 6, 19); | ||
var observed = HolidayCalculator.FixWeekendSaturdayBeforeSundayAfter(hol); | ||
return new Holiday(hol, observed, "Juneteenth"); | ||
} | ||
|
||
/// <summary> | ||
/// Independence Day | ||
/// </summary> | ||
/// <param name="year">The year.</param> | ||
/// <returns></returns> | ||
public static Holiday IndependenceDay(int year) | ||
{ | ||
var hol = new DateTime(year, 7, 4); | ||
var observed = HolidayCalculator.FixWeekendSaturdayBeforeSundayAfter(hol); | ||
return new Holiday(hol, observed, "IndependenceDay"); | ||
} | ||
|
||
/// <summary> | ||
/// First Monday in September | ||
/// </summary> | ||
/// <param name="year">The year.</param> | ||
/// <returns></returns> | ||
public static Holiday LaborDay(int year) | ||
{ | ||
var hol = new DateTime(year, 9, 1); | ||
hol = HolidayCalculator.FindFirstMonday(hol); | ||
return new Holiday(hol, hol, "LaborDay"); | ||
} | ||
|
||
/// <summary> | ||
/// Thanksgiving - Fourth Thursday in November | ||
/// </summary> | ||
/// <param name="year">The year.</param> | ||
/// <returns></returns> | ||
public static Holiday Thanksgiving(int year) | ||
{ | ||
var hol = new DateTime(year, 11, 22); | ||
hol = HolidayCalculator.FindOccurrenceOfDayOfWeek(hol, DayOfWeek.Thursday, 1); | ||
return new Holiday(hol, hol, "Thanksgiving"); | ||
} | ||
|
||
/// <summary> | ||
/// Christmas Day | ||
/// </summary> | ||
/// <param name="year">The year.</param> | ||
/// <returns></returns> | ||
public static Holiday Christmas(int year) | ||
{ | ||
var hol = new DateTime(year, 12, 25); | ||
return new Holiday(hol, HolidayCalculator.FixWeekendSaturdayBeforeSundayAfter(hol), "Christmas"); | ||
} | ||
#endregion | ||
|
||
/// <summary> | ||
/// Get a list of dates for all holidays in a year. | ||
/// </summary> | ||
/// <param name="year">The year.</param> | ||
/// <returns></returns> | ||
public override IList<DateTime> PublicHolidays(int year) | ||
{ | ||
var bHols = new List<DateTime>(); | ||
|
||
foreach (Holiday localholiday in PublicHolidaysInformation(year)) | ||
{ | ||
bHols.Add(localholiday); | ||
|
||
} | ||
|
||
return bHols; | ||
} | ||
|
||
/// <summary> | ||
/// Gets a list of public holidays with their observed and actual date | ||
/// </summary> | ||
/// <param name="year">The given year</param> | ||
/// <returns></returns> | ||
public override IList<Holiday> PublicHolidaysInformation(int year) | ||
{ | ||
|
||
#if NETSTANDARD1_3_OR_GREATER || NET40_OR_GREATER | ||
if (UseCachingHolidays) | ||
{ | ||
return _cacheHolidays.GetOrAdd(year, y => | ||
{ | ||
return PublicHolidaysComplete(year); | ||
}); | ||
} | ||
#endif | ||
|
||
return PublicHolidaysComplete(year); | ||
|
||
} | ||
|
||
/// <summary> | ||
/// Gets a list of public holidays with their observed and actual date | ||
/// </summary> | ||
/// <param name="year">The given year</param> | ||
/// <returns></returns> | ||
private IList<Holiday> PublicHolidaysComplete(int year) | ||
{ | ||
var bHols = new List<Holiday>(); | ||
bHols.Add(NewYear(year)); //1st January | ||
bHols.Add(MartinLutherKing(year)); // Third Monday in January | ||
bHols.Add(PresidentsDay(year)); //Third Monday in February | ||
bHols.Add(GoodFriday(year)); //Friday before Easter | ||
bHols.Add(MemorialDay(year)); //Last Monday in May | ||
if (year >= 2022) | ||
{ | ||
bHols.Add(Juneteenth(year)); //19th June, from 2022 | ||
} | ||
bHols.Add(IndependenceDay(year)); //4 July | ||
bHols.Add(LaborDay(year)); //First Monday in September | ||
bHols.Add(Thanksgiving(year)); //Fourth Thursday in November | ||
bHols.Add(Christmas(year)); //25 December | ||
|
||
return bHols; | ||
} | ||
|
||
/// <summary> | ||
/// Get a list of dates with names for all holidays in a year. | ||
/// </summary> | ||
/// <param name="year">The year.</param> | ||
/// <returns></returns> | ||
public override IDictionary<DateTime, string> PublicHolidayNames(int year) | ||
{ | ||
var bHols = new Dictionary<DateTime, string>(); | ||
|
||
foreach (Holiday localholiday in PublicHolidaysInformation(year)) | ||
{ | ||
bHols.Add(localholiday, localholiday.GetName()); | ||
|
||
} | ||
|
||
return bHols; | ||
} | ||
/// <summary> | ||
/// Check if a specific date is a federal holiday. | ||
/// Obviously the PublicHoliday list is more efficient for repeated checks | ||
/// </summary> | ||
/// <param name="dt">The date you wish to check</param> | ||
/// <returns>True if date is a federal holiday (excluding weekends)</returns> | ||
public override bool IsPublicHoliday(DateTime dt) | ||
{ | ||
int year = dt.Year; | ||
var date = dt.Date; | ||
|
||
switch (dt.Month) | ||
{ | ||
case 1: | ||
if (NewYear(year) == date) | ||
return true; | ||
if (MartinLutherKing(year) == date) | ||
return true; | ||
break; | ||
case 2: | ||
if (PresidentsDay(year) == date) | ||
return true; | ||
break; | ||
case 4: | ||
if (GoodFriday(year) == date) | ||
return true; | ||
break; | ||
case 5: | ||
if (MemorialDay(year) == date) | ||
return true; | ||
break; | ||
case 6: | ||
if (year >= 2022 && Juneteenth(year) == date) | ||
return true; | ||
break; | ||
case 7: | ||
if (IndependenceDay(year) == date) | ||
return true; | ||
break; | ||
case 9: | ||
if (LaborDay(year) == date) | ||
return true; | ||
break; | ||
case 11: | ||
if (Thanksgiving(year) == date) | ||
return true; | ||
break; | ||
case 12: | ||
if (Christmas(year) == date) | ||
return true; | ||
if (NewYear(year + 1) == date) | ||
return true; //31st December if New Year is Saturday | ||
break; | ||
} | ||
return false; | ||
} | ||
} | ||
} |
Oops, something went wrong.