nager / Nager.Date

Worldwide holidays (REST API), NuGet or docker container :earth_americas:
https://date.nager.at
MIT License
1.06k stars 171 forks source link
bank-holidays calculate-holidays calendar calendar-api holiday holiday-api holiday-calculation holiday-software holidayapi holidays holidays-api public-apis public-holiday public-holidays publicholidays rest-api

Build, Test & Publish

:calendar: Nager.Date - Official Website

Discover the convenience of easily accessing holidays from over 100 countries with Nager.Date. Our popular project utilizes the power of .NET and offers a user-friendly public REST API for seamless integration into your application.

You can find an overview of the supported countries here.

Need offline access to our functionality? No problem! We also provide solutions that allow you to use our services on your own infrastructure without an internet connection. Easily integrate our service into your system with the Docker container or the NuGet package. Both options require a license key. As a sponsor of nager, you get a license key.

[!CAUTION] The WebApi V2 will be shut down in December 2024
Please only use the latest WebApi V3

How can I use it?

Easily create a client in your preferred programming language by utilizing our Swagger definition. Find all the necessary information in our API section. Get more details about client generation in the documentation.

Examples

.NET/C# (click to expand) There are two ways to use our service **[NuGet - Nager.Holiday](https://www.nuget.org/packages/Nager.Holiday)** ``` PM> install-package Nager.Holiday ``` **Copy Code** ```cs using System; using System.Net.Http; using System.Text.Json; var jsonSerializerOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; using var httpClient = new HttpClient(); using var response = await httpClient.GetAsync("https://date.nager.at/api/v3/publicholidays/2022/US"); if (response.IsSuccessStatusCode) { using var jsonStream = await response.Content.ReadAsStreamAsync(); var publicHolidays = JsonSerializer.Deserialize(jsonStream, jsonSerializerOptions); } class PublicHoliday { public DateTime Date { get; set; } public string LocalName { get; set; } public string Name { get; set; } public string CountryCode { get; set; } public bool Fixed { get; set; } public bool Global { get; set; } public string[] Counties { get; set; } public int? LaunchYear { get; set; } public string[] Types { get; set; } } ```
PHP (click to expand) This example use the [guzzle](https://github.com/guzzle/guzzle) project ```php request('GET', 'https://date.nager.at/api/v3/publicholidays/2022/US'); if ($response->getStatusCode() == 200) { $json = $response->getBody(); print_r(json_decode($json)); } ?> ```
Java (click to expand) This example use the springframework. Code tested with [onecompiler.com](https://onecompiler.com) `Main.java` ```java import java.util.*; import org.springframework.web.client.RestTemplate; import com.google.gson.*; public class Main { public static void main(String[] args) { System.out.println("get holidays"); String json = new RestTemplate().getForObject("https://date.nager.at/api/v3/publicholidays/2022/CH", String.class); Gson gson = new Gson(); PublicHoliday[] userArray = gson.fromJson(json, PublicHoliday[].class); for(PublicHoliday publicHoliday : userArray) { System.out.print(publicHoliday.date); System.out.print(" "); System.out.print(publicHoliday.name); System.out.print(" "); System.out.print(String.join(",", publicHoliday.counties ?? new String[0])); System.out.print(" "); System.out.println(publicHoliday.localName); } } } ``` `PublicHoliday.java` ```java public class PublicHoliday { public String date; public String localName; public String name; public String countryCode ; public Boolean fixed; public Boolean global; public String[] counties; public String[] types; } ``` `build.gradle` ```java apply plugin:'application' mainClassName = 'Main' run { standardInput = System.in } sourceSets { main { java { srcDir './' } } } repositories { jcenter() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web:2.6.7'; implementation 'com.google.code.gson:gson:2.10.1'; } ```
Python (click to expand) `main.py` ```py import json import requests response = requests.get('https://date.nager.at/api/v3/publicholidays/2022/US') public_holidays = json.loads(response.content) for public_holiday in public_holidays: print(public_holiday['date']) ```

Offline Solution

Don't let internet connectivity issues disrupt your workflow. Our offline solutions enable you to use our services on your own infrastructure without an internet connection. With a sponsorship you get the license key to use the variants locally without a dependency to our REST API.

NuGet

The NuGet package is available via NuGet

PM> install-package Nager.Date
Code Examples (click to expand) ## Examples for .NET (NuGet package) ### Set the license key ```cs HolidaySystem.LicenseKey = "LicenseKey1234"; ``` ### Get all holidays of a country and year ```cs var holidays = HolidaySystem.GetHolidays(2024, "DE"); foreach (var holiday in holidays) { //holiday... //holiday.Date -> The date //holiday.LocalName -> The local name //holiday.EnglishName -> The english name //holiday.NationalHoliday -> Is this public holiday in every county (federal state) //holiday.SubdivisionCodes -> Is the public holiday only valid for a special county ISO-3166-2 - Federal states //holiday.HolidayTypes -> Public, Bank, School, Authorities, Optional, Observance } ``` ### Get all holidays for a date range ```cs var startDate = new DateTime(2016, 5, 1); var endDate = new DateTime(2024, 5, 31); var holidays = HolidaySystem.GetHolidays(startDate, endDate, CountryCode.DE); foreach (var holiday in holidays) { //holiday... } ``` ### Check if a date is a public holiday ```cs var date = new DateTime(2024, 1, 1); if (HolidaySystem.IsPublicHoliday(date, CountryCode.DE)) { Console.WriteLine("Is a public holiday"); } ``` ### Checks if the given date falls on a weekend day ```cs var date = new DateTime(2024, 1, 1); if (WeekendSystem.IsWeekend(date, CountryCode.DE)) { Console.WriteLine("The date is in the weekend"); } ```

Docker

The Docker container is available via Docker Hub
To run a local instance of the Docker image run the following command
docker run -p 80:8080 nager/nager-date

Holiday types

What variants of holidays are supported by Nager.Date

Type Description
Public Public holiday
Bank Bank holiday, banks and offices are closed
School School holiday, schools are closed
Authorities Authorities are closed
Optional Majority of people take a day off
Observance Optional festivity, no paid day off

Data precision

There is no generally valid designation for the next administrative level of countries. "Nager.Date" supports the initial subdivision of a country, but we will not support a detailed level because the effort required is too high.

To keep it generally valid, we will treat this subdivision as SubdivisionCodes, this will replace the current designation Counties.

Precision Supported
Public Holidays for specific Country Yes
Holidays for Subdivisions based on ISO 3166-2 (first level) Yes
Holidays for Cities No
Holidays for Regions No

Areas of Application

There are several business fields in which it is important to know the holidays in different countries.

Articles about this project