PublicHoliday 4.0.0

dotnet add package PublicHoliday --version 4.0.0
                    
NuGet\Install-Package PublicHoliday -Version 4.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="PublicHoliday" Version="4.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="PublicHoliday" Version="4.0.0" />
                    
Directory.Packages.props
<PackageReference Include="PublicHoliday" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add PublicHoliday --version 4.0.0
                    
#r "nuget: PublicHoliday, 4.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package PublicHoliday@4.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=PublicHoliday&version=4.0.0
                    
Install as a Cake Addin
#tool nuget:?package=PublicHoliday&version=4.0.0
                    
Install as a Cake Tool

Public Holidays

Nuget: Install-Package PublicHoliday Nuget

Orders and deliveries, data transfers, and other processes can often only be made on business working days. They cannot be made on national public holidays. Public holidays in many countries can be calculated algorithmically.

Upgrading from 3.x? Version 4.0 is a major release with a few breaking changes (PublicHolidayNames returns string[] per date, holiday names moved into per-culture resource files, IHoliday.GetName() removed, obsolete members removed). See UPGRADING-4.0.md.

Want to add a country or holiday? Since 4.0 that is mostly declarative — see CONTRIBUTING.md for two worked examples.

//get a list of all holidays for 2017
IList<DateTime> result = new USAPublicHoliday().PublicHolidays(2017);

//get the next working day
DateTime dayAfterColumbus = new USAPublicHoliday().NextWorkingDay(new DateTime(2006, 10, 8)); //returns 10 October 2006

//2nd January 2006 is a Monday. But because 1st January was a Sunday, the bank holiday is the next Monday
bool isHoliday = new UKBankHoliday().IsBankHoliday(new DateTime(2006, 1, 2)); //returns true

//what's the next working day after Sunday 24th December 2006?
DateTime nextWorkingDay = new UKBankHoliday().NextWorkingDay(new DateTime(2006, 12, 24)); //returns 27 December 2006

The library contains adjustments for one-off holidays.

//Next working day after royal wedding - next working day is Tuesday 3rd May (Monday 2nd is MayDay)
DateTime nextWorkingDayAfterRoyalWedding = new UKBankHoliday().NextWorkingDay(new DateTime(2011, 4, 29));

There are libraries for:

  • Europe
    • Austria : AustriaPublicHoliday
    • Belgium : BelgiumPublicHoliday
    • Croatia : CroatiaPublicHoliday
    • Czech Republic : CzechRepublicPublicHoliday
    • ECB : EcbTargetClosingDay (European Central Bank SEPA Target Closing days - no exchange rates and no SEPA transactions)
    • Denmark : DenmarkPublicHoliday
    • Estonia : EstoniaPublicHoliday
    • Finland: FinlandPublicHoliday
    • France : FrancePublicHoliday
    • Germany : GermanPublicHoliday (set State property for regional holidays)
    • Greece : GreecePublicHoliday
    • Hungary: HungaryPublicHoliday
    • Ireland : IrelandPublicHoliday
    • Italy : ItalyPublicHoliday
    • Latvia : LatviaPublicHoliday
    • Lithuania : LithuaniaPublicHoliday
    • Luxembourg : LuxembourgPublicHoliday
    • Montenegro : MontenegroPublicHoliday
    • Netherlands : DutchPublicHoliday
    • Norway : NorwayPublicHoliday
    • Poland : PolandPublicHoliday
    • Portugal : PortugalPublicHoliday (set Region property for Madeira/Açores regional holidays)
    • Romania : RomanianPublicHoliday
    • Serbia : SerbianPublicHoliday
    • Slovakia : SlovakiaPublicHoliday
    • Spain : SpainPublicHoliday
    • Slovenia : SloveniaPublicHoliday
    • Sweden : SwedenPublicHoliday
    • Switzerland: SwitzerlandPublicHoliday
    • UK : UKBankHoliday (set UkCountry property for Scotland/Northern Ireland variations)
    1. Europe/Asia
    • Kazakhstan : KazakhstanPublicHoliday
    • Turkey : TurkeyPublicHoliday
  • N America
    • Canada : CanadaPublicHoliday (set Province in constructor for regional holidays)
    • Canada : CanadaQuebecGovClosingDay (Government province of Quebec closing day)
    • Mexico : MexicoPublicHoliday
    • USA : USAPublicHoliday
    • USA : USAFederalReserveHoliday
    • USA : USANewYorkStockExchangeHoliday
  • S America
    • Brazil : BrazilPublicHoliday
  • Oceania
    • Australia : AustraliaPublicHoliday (set State property for regional holidays, see note below)
    • New Zealand : NewZealandPublicHoliday
  • Asia
    • Japan : JapanPublicHoliday
  • Africa
    • South Africa : SouthAfricaPublicHoliday

All use the common interface IPublicHolidays containing:

  • IsPublicHoliday(DateTime) (UK: also IsBankHoliday(DateTime))
  • IsWorkingDay(DateTime) (i.e. not public holiday, Saturday or Sunday)
  • NextWorkingDay(DateTime)
  • NextWorkingDay(DateTime, int)
  • NextWorkingDayNotSameDay(DateTime)
  • NextWorkingDayNotSameDay(DateTime, int)
  • PreviousWorkingDay(DateTime)
  • PreviousWorkingDay(DateTime, int)
  • PreviousWorkingDayNotSameDay(DateTime)
  • PreviousWorkingDayNotSameDay(DateTime, int)
  • PublicHolidays(int year)
  • PublicHolidaysInformation(int year)
  • PublicHolidayNames(int year) (returns IDictionary<DateTime, string[]> — one name per holiday on a day, usually one)
  • PublicHolidayNames(int year, CultureInfo culture)
  • GetHolidaysInDateRange(DateTime, DateTime)
  • BusinessDaysAdd(DateTime, int)
    • if you have an <abbr title="servive level agreement">SLA</abbr>/turn-around time of 3 business days, calendar.BusinessDaysAdd(dt, 3) will give you the end-date 3 business days (Mon-Fri excluding public holidays)
  • BusinessDaysBetween(DateTime, DateTime) (number of Mon-Fri working days)
  • Culture (the language holiday names come back in — see Localized holiday names)

There are also static methods for all statutory holidays.

Finding a specific holiday

Every holiday carries a stable identifier, Holiday.HolidayKey — the same for every year, language and country that observes it. The HolidayKeys class holds one constant per holiday, so a specific holiday is found without magic strings or knowing its date:

var calendar = PublicHolidayFactory.GetPublicHolidayForCountry("BE");
var christmas = calendar.PublicHolidaysInformation(2026)
    .Single(h => h.HolidayKey == HolidayKeys.Christmas);

Localized holiday names

PublicHolidaysInformation(year) returns Holiday objects, each of which can give you its name three ways:

the question it answers Belgium's 25 December
holiday.Name what does this calendar call it? Kerstmis
holiday.EnglishName English, always Christmas
holiday.GetName(culture) what is it called in this language? fr-BE → Noël, fr → Fête de Noël, es → Kerstmis (no Spanish, so the calendar's own)

A name is never empty: whatever you ask for, the holiday's own EnglishName is there as the last resort.

var calendar = PublicHolidayFactory.GetPublicHolidayForCountry("BE");
var christmas = calendar.PublicHolidaysInformation(2026)
    .Single(h => h.HolidayDate == new DateTime(2026, 12, 25));

christmas.Name;                                // "Kerstmis"
christmas.GetName(new CultureInfo("fr-BE"));   // "Noël"
christmas.GetName(new CultureInfo("de-BE"));   // "Weihnachten"

// or a whole year in one language
IDictionary<DateTime, string[]> french = calendar.PublicHolidayNames(2026, new CultureInfo("fr-BE"));

One app, many countries: pick the calendar from the user

Nothing needs to name a country. Ask the factory for the user's country and let the same locale choose the language, so a calendar screen localises itself:

var user = CultureInfo.CurrentUICulture;                            // e.g. "fr-BE"
var country = new RegionInfo(user.Name).TwoLetterISORegionName;      // "BE"

IPublicHolidays calendar = PublicHolidayFactory
    .GetPublicHolidayForCountry(country)                             // BelgiumPublicHoliday
    .WithCulture(user);                                              // answering in French

foreach (var holiday in calendar.PublicHolidaysInformation(DateTime.Today.Year))
{
    Show(holiday.ObservedDate, holiday.Name);                        // "Noël", "Nouvel An", ...
}

The same three lines cover every supported country — de-DE gives you German holidays named Weihnachtstag, nl-BE gives Belgian ones named Kerstmis, el-GR gives Greek ones named Πρωτοχρονιά. Three things to handle:

  • Not every country is supported. GetPublicHolidayForCountry throws ArgumentOutOfRangeException for a country code the library has no calendar for, so catch it and fall back to whatever your app does without a holiday calendar.
  • Not every country has translated names yet. Where a language has no resource file the names come back in English — today that includes Poland and Japan. Adding them is a translation file, not code, and you can supply your own in the meantime (below).
  • Derive the country from a specific culture, not a neutral one. CurrentUICulture normally is specific (fr-BE), but new RegionInfo("et") does not mean Estonia — it means Ethiopia, and new RegionInfo("el") throws. If your app can hand you a bare language, take the country from your own user profile instead of inferring it.

Reading a country in another of its languages

Name answers in the calendar's Culture, which you can choose once instead of passing a culture to every call. WithCulture works on any calendar and keeps its type, so it combines with a region:

new BelgiumPublicHoliday().PublicHolidaysInformation(2026).Last().Name;    // "Kerstmis"
new BelgiumPublicHoliday().WithCulture("fr-BE")
    .PublicHolidaysInformation(2026).Last().Name;                         // "Noël"

new CanadaPublicHoliday("QC").WithCulture("fr-CA");                       // province + language
new AustraliaPublicHoliday { State = AustraliaPublicHoliday.States.NSW }
    .WithCulture("en-AU");

// or set it directly, before or after a first call - the year cache is cleared for you
var swiss = new SwitzerlandPublicHoliday { Culture = new CultureInfo("fr-CH") };

Where the names come from

One resource file per culture (Localization/Names/<culture>.resx), keyed by a stable id per holiday (Holiday.HolidayKey). A lookup tries the culture asked for, then its parents:

File Holds
Names/et.resx Estonian — Estonia is the only country that speaks it, so the language file is all it needs
Names/de.resx German as a general translation — Neujahrstag
Names/de-AT.resx Austria's own wording where it differs — Neujahr

So de-AT answers from Austria's file, de-LI (no file) from de, and fr-GF from fr. Region files exist only where a language spans several supported countries: de, en, es, fr, nl, pt, sr. Everything else is a plain language file.

English needs no file: it is the EnglishName on each holiday definition. Countries share ids for shared holidays (Christmas, Easter, …), so one language file serves every country that observes them — adding French covers Estonia's Easter Monday as much as France's.

Supplying your own translations

The library does not ship every language, and you may disagree with one it does. Register an IHolidayNameProvider and it is asked before the library's own names.

Say a Polish company in Brussels wants Belgian holidays in Polish for its staff. Put the translations in a .resx of your own, named by holiday id, and wire it up in one line at start-up:

// MyHolidayNames.resx (neutral) + MyHolidayNames.pl.resx, with rows named after the holiday's
// HolidayKey: "NewYear", "EasterMonday", "BelgianNationalDay", "Christmas", ...
HolidayNameProviders.Add(new ResourceManagerNameProvider(MyHolidayNames.ResourceManager));

var belgium = PublicHolidayFactory.GetPublicHolidayForCountry("BE").WithCulture("pl");

foreach (var holiday in belgium.PublicHolidaysInformation(2026))
{
    holiday.Name;   // "Nowy Rok", "Poniedziałek Wielkanocny", "Belgijskie Święto Narodowe", ...
}

Any other store works — a database, JSON, constants — by implementing the interface yourself:

public sealed class PolishHolidayNames : IHolidayNameProvider
{
    private static readonly Dictionary<string, string> Names = new Dictionary<string, string>
    {
        { "NewYear", "Nowy Rok" },
        { "BelgianNationalDay", "Belgijskie Święto Narodowe" },
        { "Christmas", "Boże Narodzenie" },
    };

    public bool TryGetName(string localizationKey, CultureInfo culture, out string name)
    {
        name = null;
        return culture != null
            && culture.TwoLetterISOLanguageName == "pl"
            && Names.TryGetValue(localizationKey, out name);
    }
}

Two rules worth knowing:

  • Answer for one exact culture only. The library tries nl-BE, then nl, then invariant, and asks your provider at each step. Falling back yourself would let a generic answer of yours beat a more specific one.
  • The closest culture wins, whoever supplied it. Your provider is asked before the library's own names for the same culture, so you can override them — but a shipped nl-BE name still beats a culture-neutral one of yours.

Providers are process-wide and normally registered once at start-up; HolidayNameProviders.Remove and HolidayNameProviders.Clear undo it. A key your provider does not know falls through to the library, so a partial translation is fine — with the Polish set above, Name gives Nowy Rok and Boże Narodzenie but Ascension and Labour Day in English.

That last point is the difference between the two ways of choosing a language:

untranslated holidays come back in
Culture = "pl" / WithCulture("pl") English — you replaced the calendar's language with Polish
GetName(new CultureInfo("pl")) the country's own language (Kerstmis) — the calendar's language is untouched

So set Culture when your app wants one language or a neutral fallback, and use GetName when you want a translation but would rather see the local name than English.

Weekend Rules

For many countries, when holidays fall on a weekend, the next working Monday becomes a public holiday (this is sometimes called "Mondayised"). This is the general rule in the UK, and used for certain (but not all) holidays in Australia and New Zealand.

In the USA, when holidays fall on Sundays, the holiday is moved to Monday. When the holiday falls on Saturday, the holiday is moved to the preceding Friday. The USA Federal Reserve holidays differ slightly, as holidays that fall on a Saturday do not cause a closure on the preceding Friday as described on the Federal Reserve's website.

For most of Europe, there is no standard rule for when the holidays fall on weekends. Normally these days are just added to the annual leave.

Some countries add a day off rather than move the holiday. Latvia does it for the three holidays its law names - 4 May, 18 November and the Song and Dance Festival closing day - and not for Christmas or New Year's Eve: the holiday stays on its weekend date, and the next working day is a "transferred day off" (pārceltā brīvdiena), listed as a holiday of its own:

// 4 May 2024 was a Saturday, so Monday 6 May was a day off as well
var holidays = new LatviaPublicHoliday().PublicHolidaysInformation(2024);
// 2024-05-04  Latvijas Republikas Neatkarības atjaunošanas diena
// 2024-05-06  Latvijas Republikas Neatkarības atjaunošanas diena (pārceltā brīvdiena)
var dayOff = holidays.Single(h => h.HolidayKey == HolidayKeys.RestorationOfIndependenceDayTransferredLV);

Variations by states and province

In Canada there are some provincial holidays that vary by region. You can access these by passing in the ISO Code of the province to the constructor

//Retrieve a list of holidays in Saskatchewan for 2016
IList<DateTime> result = new CanadaPublicHoliday("SK").PublicHolidays(2016);

In France the calendar comes with holidays valid in all the country.

// Get the list of public holidays for 2024
IList<DateTime> result = new FrancePublicHoliday().PublicHolidays(2024);

// Get the list of public holidays name and date for 2024
IDictionary<DateTime, string[]> names = new FrancePublicHoliday().PublicHolidayNames(2024);

A method returns a list of objects for all public holidays, with the names of the regions concerned for each date :

var calendar = new FrancePublicHoliday { Region = FrancePublicHoliday.Regions.Martinique };
// Get the 14 dates for the public holidays in Martinique for 2024
var hols = calendar.PublicHolidays(2024);

// We can also recover all the public holidays of all the regions combined
var calendar = new FrancePublicHoliday { };
IList<DateTime> hols = calendar.PublicHolidays(2024);

In Germany specify the state using an enum (the ISO code)

//Calendar for Saxony
var calendar = new GermanPublicHoliday { State = GermanPublicHoliday.States.SN };
IList<DateTime> result = calendar.PublicHolidays(2017);
//result contains 22 November 2017, Repentance and Prayer Day

In United Kingdom England/Wales is default. Specify Scotland or Northern Ireland using an enum

//Calendar for Scotland
var calendar = new UKBankHoliday { UkCountry = UKBankHoliday.UkCountries.Scotland };
IList<DateTime> result = calendar.PublicHolidays(2022);
//result contains 30 November 2022, St Andrew's Day

In Switzerland the calendar comes with holidays valid in all the country. Add further ones depending on your local rules in the constructor. Choices: hasSecondJanuary, hasLaborDay, hasCorpusChristi, hasChristmasEve, hasNewYearsEve.

var calendar = new SwitzerlandPublicHoliday { Canton = SwitzerlandPublicHoliday.Cantons.OW };
var nationalDay = new DateTime(2024, 8, 1);
//yes it is
var isHoliday = calendar.IsPublicHoliday(nationalDay);

// We can also recover all the public holidays of all the cantons combined
var holidayCalendar = new SwitzerlandPublicHoliday { Canton = SwitzerlandPublicHoliday.Cantons.ALL };
IList<DateTime> hols = holidayCalendar.PublicHolidays(2024);

A method returns a list of objects for all public holidays, with the names of the regions concerned for each date :

var holidayCalendar = new SwitzerlandPublicHoliday();
IList<Holiday> hols = holidayCalendar.PublicHolidaysInformation(2024);

In Australia most holidays are defined by the state or territory. Specify the state using an enum (the ISO code).

//Calendar for Western Australia
var calendar = new AustraliaPublicHoliday { State = AustraliaPublicHoliday.States.WA };
var westernAustraliaDay = new DateTime(2017, 6, 5);
//yes it is
var isHoliday = calendar.IsPublicHoliday(westernAustraliaDay);

IMPORTANT A few Australia state holidays do not have fixed rules, and cannot be calculated.

  • For Victoria, AFL Grand Final Day
  • For Western Australia, Queen's Birthday (we assume end September BUT may change)
  • The calendar does not contain local holidays (Royal Queensland Show day, Royal Hobart Regatta)

Thanks

@petergaal @msmells @oliver-h @DanielSundberg @kant2002 @zanemcca @jcdekoning @thelious @rickbeerendonk @skipishere @MilkyWare @Hrothval @mihaigliga21

License

License is MIT. You are free to use this software in commercial projects.

Building the Source

  • Supports .net 3.5. To enable dism /online /enable-feature /featurename:NetFx3 /All
  • If you use Visual Studio 2026 or Visual Studio 2022 open PublicHoliday.sln (.net 8 +, supports .net 10)
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net35 is compatible.  net40 is compatible.  net403 was computed.  net45 was computed.  net451 was computed.  net452 was computed.  net46 is compatible.  net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETFramework 3.5

    • No dependencies.
  • .NETFramework 4.0

    • No dependencies.
  • .NETFramework 4.6

    • No dependencies.
  • .NETStandard 2.0

    • No dependencies.
  • net10.0

    • No dependencies.
  • net8.0

    • No dependencies.

NuGet packages (5)

Showing the top 5 NuGet packages that depend on PublicHoliday:

Package Downloads
SpCraft.Net.Common.DateTime

Package Description

Parlem.Provisioning.Drivers

Package Description

PsA3Forms

Package Description

DateFunctions

Set of common commands for calculating previous working days, bank holidays and working days

Novolis.Time.Calendar.PublicHoliday

Offline PublicHoliday-backed public holiday calendars for Novolis worktime.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
4.0.0 189 11/11/2026
3.17.0 21,251 10/29/2026
3.16.0 82,946 9/28/2026
3.14.0 242,580 7/27/2026
3.13.0 290,914 5/11/2026
3.12.0 146,256 4/4/2026
3.11.0 300,463 2/6/2026
3.10.0 118,585 1/2/2026
3.9.0 469,096 8/31/2025
3.8.0 101,015 7/25/2025
3.7.0 108,576 7/13/2025
3.6.0 46,247 6/27/2025
3.5.0 46,793 6/13/2025
3.4.0 73,414 5/25/2025
3.3.0 40,951 5/13/2025
3.2.0 683,311 1/18/2025
3.1.0 156,342 11/29/2024
3.0.0 218,432 11/11/2024
2.41.0 380,498 9/3/2024
2.40.0 87,744 8/12/2024
Loading failed

2.0.2: Fix for AU-NSW-2016 (thanks @dotnetshadow)
2.0.3: Canada BC changing family day from 2019
2.0.4: UK Early May Day 2020 moved (thanks @skipishere)
2.0.5: UK Early May Day 2020 Monday (thanks @deltafsdevelopment )
2.0.6: IsWorkingDay added (thanks @MilkyWare)
2.0.7: DE recent changes (thanks @janaw)
2.0.8: Austria 2008 error (thanks @OtmarP)
2.1.0: South Africa added (thanks @cltw666)
2.2.0: Japan 2020 error (thanks @overstimulated)
2.3.0: UK 2022 Queen's Platinum Jubilee
2.4.0: Scotland, Northern Island holidays (thanks @stuart-lawrence)
2.5.0: US 2021 Juneteenth added
2.6.0: New Zealand Matariki dates added for next 30 years
2.7.0: Add Denmark (thanks @Halling69), add Canada Truth&Reconciliation from 2021 (thanks @mattandwhatnot), change Japan Emperors Day (thanks @zimathon)
     2.8.0: Add Canada Governement Quebec Closing Day , improve HolidayCalculator (thanks @Hrothval)
     2.9.0: Add Localized String for class Holiday, Adding cache for Easter for performance framework 4.0+/andard1.3+ thanks @Hrothval) Added RomanianPublicHoliday (thanks @mihaigliga21)
     2.10.0: Add in HolidayCalculator PreviousWorkingDay/NextWorkingDay with x open day, Add eCachingHolidays with efault to false in IPublicHolidays/PublicHolidayBase, Add in IsWorkingDay in ublicHolidays, Add target .NET 5.0 thanks @Hrothval)
     2.11.0: Add Estonia (thanks @Kaupo) Add USAFederalReserveHoliday (thanks @AndrewPecha). Add calizationString for rance and US. Adjust framework for code section, CanadaQuebecGovClosingDay djustholiday name for past year anadaDay and NationalPatriotDay, HolidayCalculator reviousWorkingDay/extWorkingDay option ignore same day, PublicHolidays/PublicHolidayBase add eviousWorkingDayNotSameDay and NextWorkingDayNotSameDay, USAPublicHoliday dd holiday name and andardization (thanks @Hrothval)
     2.12.0: Fix DutchPublicHoliday LiberationDay (thanks @sergiu05)
     2.13.0: Fix ANZAC/Easter Monday conflict (thanks @seancallinan )
     2.14.0: #66 Add holiday names for USAFederalReserveHoliday
     2.15.0: #67 Fix spelling Switzerland Pfingsten
     2.16.0 #69 Add Lithuania (thanks @aursad)
     2.16.2 #72 Add state funeral of Queen Elizabeth II, UK, Canada, Australia, New Zealand (thanks eancallinan )
     2.17.0 #73 NZ provincial holidays added (thanks @seancallinan ) #74 Germany holiday error
     2.18.0 #77 South african public holidays fixes (thanks @FifoTheHein ) #78 Added polish diacritics hanks@konradbartecki )
     2.19.0 #79 Added Turkey (thanks @HakanUcaar )
     2.20.0 Added UK special holiday for Coronation, 2023
     2.21.0 #81 Added Slovenian holidays (thanks @KlemenS189 )
     2.22.0: #82 South Africa Christmas dates moved (thanks @ FifoTheHein )
     2.23.0: #83 Add Finland holidays (thanks @vergi40 )
     2.24.0: Ireland adds St Brigid's day from 2023
     2.25.0: Australia + New Zealand- King's Birthday added (Queen's Birthday retained for backwards API mpatibility/istoric dates), Denmark remove General Prayer Day from 2024 (thanks @Jesper Nysteen)
     2.26.0: Add Greece holidays
     2.27.0: Fix issues with Turkey Holidays (thanks @ahmet-cetinkaya )
     2.28.0: #94 #96 Conditional holidays in Denmark (day after Ascension) and Netherlands (Liberation Day tionally nly in Lustrum years) -Thanks @SeanSEmerson, @swannet)
     2.29.0: Womans Day in Mecklenburg-Vorpommern since 2023, added Serbian holidays (thanks @Reo1980, lekseiKrasilnikov)
     2.30.0: #102 Add Montenegro holidays (thanks @anovik); add netstandard2.1 target, no other changes
     2.31.0: #103 Add missing holidays for Brandenburg (thanks @Cryma); #104 Germany: Assumption in Bavaria hanks mkrso )
     2.32.0: #107 Serbia orthodox easter (thanks @anovik); #108 UK boxing day rules (thanks @spetsen)
     2.33.0: #113 #112 Ireland holidays fix weekend rules (thanks @Bjornsen016)
     2.34.0: #114 South Africa - Special holiday - 2023 Rugby World Cup Win (thanks @FifoTheHein)
     2.35.0: #115 Fixed Japanese Equinox Day calculation (thanks @Makaopior )
     2.36.0: #116 Fixed Japanese Vernal and Autumnal Equinox days (thanks @Makaopior )
     2.37.0: #120 Add Brazil holidays (thanks @rsegecin ), Netherlands add Good Friday (thanks @wdnijdam  )
     2.38.0: #122 Update Switzerland Holiday with Cantons (thanks @tossnet), Add NYSE holidays  (thanks stephenherrick )
     2.39.0: #125 Fix Turkey Ramadan and FeastOfSacrifices holidays (thanks @hasankaplan-github), #128 Update witzerland Holiday (thanks @tossnet),; #131 Update France holiday with overseas territories (thanks @tossnet); 132 Add Portugal Holiday (thanks @greybird); #133 South Africa 2024 election day (thanks @FifoTheHein)
     2.40.0: #135 Bavarian Assumption date is conditional
     2.41.0: #136 Denmark additional optional holidays (thanks @hanshb)
     3.0.0: #138 Remove Japanese character from method name due to MsBuild error- breaking change (thanks @vilinet wollac11 ); #139 add business days calculations
     3.1.0: #141 Issue with Greeneryday in Japan in 2025
     3.2.0: Added support for Christmas Eve as a public holiday in Poland starting in 2025 (thanks @Eales). Updated olish public holidays to include dynamic calculations for movable holidays like Pentecost and Corpus Christi.
     3.3.0:  added Berlin state one-time holidays to GermanPublicHoliday (thanks @emuuu )
     3.4.0: added Luxembourg Europe Day (since 2019, thanks @bbehrang)
     3.5.0: Fix Switzerland holidays by canton not correct for all methods (#149)
     3.6.0: #150 option to add NSW bank holiday to Australian public holidays (thanks @Benjlr)
     3.7.0: #152 Fix IsBankHoliday method for St Andrews day in Scotland when it falls on a weekend (thanks @NeilRobinsonSF)
     3.8.0: #155 add croatian holidays (thanks @quokkador); #154 Use the correct two letter ISO code for Poland (thanks @NeilRobinsonSF)
     3.9.0: #158 MexicoPublicHoliday added (thanks @geraldsimon)
     3.10.0: #159 Canada Boxing Day does not shift + holiday names (thanks @pasha-o); drop obsolete .net 6 + netstandard 1.3
     3.11.0: Scotland adds 2026 World Cup holiday
     3.12.0: #161 NL holidays can optionally include Easter Sunday; #160 include Hungary holidays (thanks @Anteres007)
     3.13.0: Japan Golden Weeks holidays can be moved by weekends
     3.14.0: switzerland fixes: #164 correct Geneva PrayDay to Thursday after first Sunday, #165 name Neuchâtel Republic Day, #166 culture-aware CH/FR holiday names (thanks @Flo5k5)
     3.15.0: #177 Add methods for business day calculations on interface (thanks @maltevm)
     3.16.0: #173 Add Adelaide Cup Day for South Australian (thanks @markduregon)
     3.17.0: #176 Add Latvia public holidays (thanks @GanDuumar)
     4.0.0: Architecture overhaul (breaking). Every calendar is composed from reusable holiday-definition classes (PublicHoliday.HolidayDefinitions: Christian/Common/Islamic/CountrySpecific); the calendar classes themselves stay in the root PublicHoliday namespace. Holiday names moved out of code into one embedded .resx per culture (Localization/Names), so a calendar answers in its own language and any caller can ask for another: Holiday.Name is the calendar's language, Holiday.EnglishName is always English, Holiday.GetName(culture) is a named language, and a name is never empty. Greece and the Quebec government calendar now name their holidays in Greek and French instead of English, and no longer depend on the ambient UI culture. Every calendar exposes a settable Culture (plus a WithCulture extension) so one app can follow the user's locale: PublicHolidayFactory.GetPublicHolidayForCountry(code).WithCulture(user). Translations you supply yourself can be registered through the new IHolidayNameProvider hook (HolidayNameProviders.Add, or ResourceManagerNameProvider over your own .resx). BREAKING: PublicHolidayNames returns IDictionary<DateTime, string[]> (one entry per holiday on a day - same-day holidays are no longer merged into one string or dropped); IHoliday.IdTextLocalization is renamed to HolidayKey and every key is a constant on the new HolidayKeys class (h.HolidayKey == HolidayKeys.Christmas - no more magic strings); IHoliday.GetName() with no arguments is removed, use EnglishName; IHoliday gains Name and IPublicHolidays gains Culture (implement them if you implement those interfaces); GetName("en") now returns the holiday's own EnglishName, which fixes Australian/Canadian/New Zealand Boxing Day answering "St Stephen's Day"; the localization ids of Boxing Day (BoxingDay), South Africa's Day of Goodwill (DayOfGoodwillZA) and Workers' Day (WorkersDayZA) changed; removed [Obsolete] members UseCachingHolidays, Belgium.PublicHolidayNamesFrench, CanadaQuebecGovClosingDay.PublicHolidayNamesCulture. Montenegro added to PublicHolidayFactory/PublicHolidayCountryCode ("ME"). Fixes: previously dropped same-day holidays restored (Serbia Easter in Labour-Day-collision years, Norway/Finland Ascension collisions, Italy Liberation Day on Easter days); PublicHolidaysInformation returns holiday names for every calendar (previously only calendars with a custom override); PublicHolidayNames no longer throws for Brazil (Good Friday on 21 April, e.g. 2000) and Germany (Ascension on 1 May, e.g. 2008); Serbia PublicHolidays uses Orthodox Easter to match PublicHolidayNames; UK IsBankHoliday derives from the holiday list (St Andrew's Day observed in December now recognized); GetName threw on net35/net40 (the embedded resource was read as a file path); stale results when a region/state property changes after a first call. Latvia (3.17) rebuilt on holiday definitions with the same dates: each transferred day off (pārceltā brīvdiena) is a holiday of its own with its own HolidayKey; same-day Mother's Day and Whit Sunday are two names instead of one joined string; added the 24 September 2018 Pope Francis visit holiday.