Skip to content

Commit

Permalink
NYSE holidays (#123)
Browse files Browse the repository at this point in the history
* Add nyse holidays class

* Add tests for nyse holidays

* Reference NYSE Holidays
  • Loading branch information
stephenherrick authored Apr 5, 2024
1 parent d98c67d commit 6fe0dbf
Show file tree
Hide file tree
Showing 3 changed files with 513 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ There are libraries for:
- Canada : CanadaQuebecGovClosingDay (Government province of Quebec closing day)
- USA : USAPublicHoliday
- USA : USAFederalReserveHoliday
- USA : USANewYorkStockExchangeHoliday
- S America
- Brazil : BrazilPublicHoliday
- Oceania
Expand Down
280 changes: 280 additions & 0 deletions src/PublicHoliday/USANewYorkStockExchangeHoliday.cs
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;
}
}
}
Loading

0 comments on commit 6fe0dbf

Please sign in to comment.