307 lines
11 KiB
Python
307 lines
11 KiB
Python
# holidays
|
|
# --------
|
|
# A fast, efficient Python library for generating country, province and state
|
|
# specific sets of holidays on the fly. It aims to make determining whether a
|
|
# specific date is a holiday as fast and flexible as possible.
|
|
#
|
|
# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
|
|
# dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
|
|
# ryanss <ryanssdev@icloud.com> (c) 2014-2017
|
|
# Website: https://github.com/vacanza/holidays
|
|
# License: MIT (see LICENSE file)
|
|
|
|
from datetime import date
|
|
from typing import Optional
|
|
|
|
from holidays.calendars.gregorian import JAN, FEB, MAR, JUN, JUL, SEP, NOV, DEC, _timedelta
|
|
from holidays.groups import ChristianHolidays, InternationalHolidays, StaticHolidays
|
|
from holidays.observed_holiday_base import (
|
|
ObservedHolidayBase,
|
|
ALL_TO_NEAREST_MON,
|
|
SAT_SUN_TO_NEXT_MON,
|
|
SAT_SUN_TO_NEXT_MON_TUE,
|
|
)
|
|
|
|
|
|
class NewZealand(ObservedHolidayBase, ChristianHolidays, InternationalHolidays, StaticHolidays):
|
|
"""New Zealand holidays."""
|
|
|
|
country = "NZ"
|
|
observed_label = "%s (observed)"
|
|
start_year = 1894
|
|
subdivisions = (
|
|
# ISO 3166-2: Regions and Special Island Authorities.
|
|
# https://en.wikipedia.org/wiki/ISO_3166-2:NZ
|
|
"AUK", # Auckland (Tāmaki-Makaurau).
|
|
"BOP", # Bay of Plenty (Toi Moana).
|
|
"CAN", # Canterbury (Waitaha).
|
|
"CIT", # Chatham Islands Territory (Wharekauri).
|
|
"GIS", # Gisborne (Te Tairāwhiti).
|
|
"HKB", # Hawke's Bay (Te Matau-a-Māui).
|
|
"MBH", # Marlborough (Manawatū-Whanganui).
|
|
"MWT", # Manawatū-Whanganui (Manawatū Whanganui).
|
|
"NSN", # Nelson (Whakatū).
|
|
"NTL", # Northland (Te Taitokerau).
|
|
"OTA", # Otago (Ō Tākou).
|
|
"STL", # Southland (Te Taiao Tonga).
|
|
"TAS", # Tasman (Te tai o Aorere).
|
|
"TKI", # Taranaki (Taranaki).
|
|
"WGN", # Greater Wellington (Te Pane Matua Taiao).
|
|
"WKO", # Waikato (Waikato).
|
|
"WTC", # West Coast (Te Tai o Poutini).
|
|
# Subregions:
|
|
# https://web.archive.org/web/20250415230521/https://www.govt.nz/browse/work/public-holidays-and-work/public-holidays-and-anniversary-dates/
|
|
"South Canterbury",
|
|
)
|
|
subdivisions_aliases = {
|
|
# Fullnames in English and Maori, as well as HASC.
|
|
"Auckland": "AUK",
|
|
"Tāmaki-Makaurau": "AUK",
|
|
"AU": "AUK",
|
|
"Bay of Plenty": "BOP",
|
|
"Toi Moana": "BOP",
|
|
"BP": "BOP",
|
|
"Canterbury": "CAN",
|
|
"Waitaha": "CAN",
|
|
"CA": "CAN",
|
|
"Chatham Islands Territory": "CIT",
|
|
"Chatham Islands": "CIT", # 1901-1994, as County
|
|
"Wharekauri": "CIT",
|
|
"CI": "CIT",
|
|
"Gisborne": "GIS",
|
|
"Te Tairāwhiti": "GIS",
|
|
"GI": "GIS",
|
|
"Hawke's Bay": "HKB",
|
|
"Te Matau-a-Māui": "HKB",
|
|
"HB": "HKB",
|
|
"Marlborough": "MBH",
|
|
"MA": "MBH",
|
|
"Manawatū Whanganui": "MWT",
|
|
"Manawatū-Whanganui": "MWT",
|
|
"MW": "MWT",
|
|
"Nelson": "NSN",
|
|
"Whakatū": "NSN",
|
|
"NE": "NSN",
|
|
"Northland": "NTL",
|
|
"Te Taitokerau": "NTL",
|
|
"NO": "NTL",
|
|
"Otago": "OTA",
|
|
"Ō Tākou": "OTA",
|
|
"OT": "OTA",
|
|
"Southland": "STL",
|
|
"Te Taiao Tonga": "STL",
|
|
"SO": "STL",
|
|
"Tasman": "TAS",
|
|
"Te tai o Aorere": "TAS",
|
|
"TS": "TAS",
|
|
"Taranaki": "TKI",
|
|
"TK": "TKI",
|
|
"Greater Wellington": "WGN",
|
|
"Te Pane Matua Taiao": "WGN",
|
|
"Wellington": "WGN", # Prev. ISO code from 2010-2015.
|
|
"Te Whanganui-a-Tara": "WGN", # Prev. ISO code from 2010-2015.
|
|
"WG": "WGN",
|
|
"Waikato": "WKO",
|
|
"WK": "WKO",
|
|
"West Coast": "WTC",
|
|
"Te Tai o Poutini": "WTC",
|
|
"WC": "WTC",
|
|
}
|
|
_deprecated_subdivisions = (
|
|
# Pre-1893 Naming in Previous Implementations.
|
|
"New Plymouth", # 1853-1859, Now Taranaki.
|
|
"Westland", # 1873-1876, Now West Coast.
|
|
# Unofficial Code.
|
|
"STC", # For 'South Canterbury' Subregional Holidays.
|
|
"WTL", # Westland, Correct code is WTC (for West Coast).
|
|
)
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
ChristianHolidays.__init__(self)
|
|
InternationalHolidays.__init__(self)
|
|
StaticHolidays.__init__(self, NewZelandStaticHolidays)
|
|
kwargs.setdefault("observed_rule", SAT_SUN_TO_NEXT_MON)
|
|
super().__init__(*args, **kwargs)
|
|
|
|
def _get_nearest_monday(self, *args) -> Optional[date]:
|
|
return self._get_observed_date(date(self._year, *args), rule=ALL_TO_NEAREST_MON)
|
|
|
|
def _populate_public_holidays(self):
|
|
# Bank Holidays Act 1873
|
|
# The Employment of Females Act 1873
|
|
# Factories Act 1894
|
|
# Industrial Conciliation and Arbitration Act 1894
|
|
# Labour Day Act 1899
|
|
# Anzac Day Act 1920, 1949, 1956
|
|
# New Zealand Day Act 1973
|
|
# Waitangi Day Act 1960, 1976
|
|
# Sovereign's Birthday Observance Act 1937, 1952
|
|
# Holidays Act 1981, 2003
|
|
|
|
# New Year's Day
|
|
self._add_observed(self._add_new_years_day("New Year's Day"), rule=SAT_SUN_TO_NEXT_MON_TUE)
|
|
self._add_observed(
|
|
self._add_new_years_day_two("Day after New Year's Day"), rule=SAT_SUN_TO_NEXT_MON_TUE
|
|
)
|
|
|
|
# Waitangi Day
|
|
if self._year >= 1974:
|
|
name = "Waitangi Day" if self._year >= 1977 else "New Zealand Day"
|
|
feb_6 = self._add_holiday_feb_6(name)
|
|
if self._year >= 2014:
|
|
self._add_observed(feb_6)
|
|
|
|
# Anzac Day
|
|
if self._year >= 1921:
|
|
apr_25 = self._add_anzac_day("Anzac Day")
|
|
if self._year >= 2014:
|
|
self._add_observed(apr_25)
|
|
|
|
# Easter
|
|
self._add_good_friday("Good Friday")
|
|
self._add_easter_monday("Easter Monday")
|
|
|
|
# Sovereign's Birthday
|
|
if self._year >= 1902:
|
|
name = "Queen's Birthday" if 1952 <= self._year <= 2022 else "King's Birthday"
|
|
if self._year == 1952:
|
|
self._add_holiday_jun_2(name) # Elizabeth II
|
|
elif self._year >= 1938:
|
|
self._add_holiday_1st_mon_of_jun(name) # EII & GVI
|
|
elif self._year == 1937:
|
|
self._add_holiday_jun_9(name) # George VI
|
|
elif self._year == 1936:
|
|
self._add_holiday_jun_23(name) # Edward VIII
|
|
elif self._year >= 1912:
|
|
self._add_holiday_jun_3(name) # George V
|
|
else:
|
|
# https://web.archive.org/web/20250427125629/https://paperspast.natlib.govt.nz/cgi-bin/paperspast?a=d&d=NZH19091110.2.67
|
|
self._add_holiday_nov_9(name) # Edward VII
|
|
|
|
# Matariki
|
|
dates_obs = {
|
|
2022: (JUN, 24),
|
|
2023: (JUL, 14),
|
|
2024: (JUN, 28),
|
|
2025: (JUN, 20),
|
|
2026: (JUL, 10),
|
|
2027: (JUN, 25),
|
|
2028: (JUL, 14),
|
|
2029: (JUL, 6),
|
|
2030: (JUN, 21),
|
|
2031: (JUL, 11),
|
|
2032: (JUL, 2),
|
|
2033: (JUN, 24),
|
|
2034: (JUL, 7),
|
|
2035: (JUN, 29),
|
|
2036: (JUL, 18),
|
|
2037: (JUL, 10),
|
|
2038: (JUN, 25),
|
|
2039: (JUL, 15),
|
|
2040: (JUL, 6),
|
|
2041: (JUL, 19),
|
|
2042: (JUL, 11),
|
|
2043: (JUL, 3),
|
|
2044: (JUN, 24),
|
|
2045: (JUL, 7),
|
|
2046: (JUN, 29),
|
|
2047: (JUL, 19),
|
|
2048: (JUL, 3),
|
|
2049: (JUN, 25),
|
|
2050: (JUL, 15),
|
|
2051: (JUN, 30),
|
|
2052: (JUN, 21),
|
|
}
|
|
if dt := dates_obs.get(self._year):
|
|
self._add_holiday("Matariki", dt)
|
|
|
|
# Labour Day
|
|
if self._year >= 1900:
|
|
name = "Labour Day"
|
|
if self._year >= 1910:
|
|
self._add_holiday_4th_mon_of_oct(name)
|
|
else:
|
|
self._add_holiday_2nd_wed_of_oct(name)
|
|
|
|
# Christmas Day
|
|
self._add_observed(self._add_christmas_day("Christmas Day"), rule=SAT_SUN_TO_NEXT_MON_TUE)
|
|
|
|
# Boxing Day
|
|
self._add_observed(self._add_christmas_day_two("Boxing Day"), rule=SAT_SUN_TO_NEXT_MON_TUE)
|
|
|
|
if self.subdiv == "New Plymouth":
|
|
self._populate_subdiv_tki_public_holidays()
|
|
elif self.subdiv == "South Canterbury":
|
|
self._populate_subdiv_stc_public_holidays()
|
|
elif self.subdiv in {"WTL", "Westland"}:
|
|
self._populate_subdiv_wtc_public_holidays()
|
|
|
|
def _populate_subdiv_auk_public_holidays(self):
|
|
self._add_holiday("Auckland Anniversary Day", self._get_nearest_monday(JAN, 29))
|
|
|
|
def _populate_subdiv_can_public_holidays(self):
|
|
self._add_holiday_10_days_past_1st_tue_of_nov("Canterbury Anniversary Day")
|
|
|
|
def _populate_subdiv_cit_public_holidays(self):
|
|
self._add_holiday("Chatham Islands Anniversary Day", self._get_nearest_monday(NOV, 30))
|
|
|
|
def _populate_subdiv_hkb_public_holidays(self):
|
|
self._add_holiday_3_days_prior_4th_mon_of_oct("Hawke's Bay Anniversary Day")
|
|
|
|
def _populate_subdiv_mbh_public_holidays(self):
|
|
self._add_holiday_7_days_past_4th_mon_of_oct("Marlborough Anniversary Day")
|
|
|
|
def _populate_subdiv_nsn_public_holidays(self):
|
|
self._add_holiday("Nelson Anniversary Day", self._get_nearest_monday(FEB, 1))
|
|
|
|
def _populate_subdiv_ntl_public_holidays(self):
|
|
if 1964 <= self._year <= 1973:
|
|
self._add_holiday("Waitangi Day", self._get_nearest_monday(FEB, 6))
|
|
else:
|
|
self._add_holiday("Auckland Anniversary Day", self._get_nearest_monday(JAN, 29))
|
|
|
|
def _populate_subdiv_ota_public_holidays(self):
|
|
# there is no easily determined single day of local observance?!?!
|
|
dt = self._get_nearest_monday(MAR, 23)
|
|
if dt == _timedelta(self._easter_sunday, +1): # Avoid Easter Monday
|
|
dt = _timedelta(dt, +1)
|
|
self._add_holiday("Otago Anniversary Day", dt)
|
|
|
|
def _populate_subdiv_stc_public_holidays(self):
|
|
self._add_holiday_4th_mon_of_sep("South Canterbury Anniversary Day")
|
|
|
|
def _populate_subdiv_stl_public_holidays(self):
|
|
name = "Southland Anniversary Day"
|
|
if self._year >= 2012:
|
|
self._add_easter_tuesday(name)
|
|
else:
|
|
self._add_holiday(name, self._get_nearest_monday(JAN, 17))
|
|
|
|
def _populate_subdiv_tki_public_holidays(self):
|
|
self._add_holiday_2nd_mon_of_mar("Taranaki Anniversary Day")
|
|
|
|
def _populate_subdiv_wgn_public_holidays(self):
|
|
self._add_holiday("Wellington Anniversary Day", self._get_nearest_monday(JAN, 22))
|
|
|
|
def _populate_subdiv_wtc_public_holidays(self):
|
|
dt = (
|
|
date(self._year, DEC, 5)
|
|
if self._year == 2005 # special case?!?!
|
|
else self._get_nearest_monday(DEC, 1)
|
|
)
|
|
self._add_holiday("West Coast Anniversary Day", dt)
|
|
|
|
|
|
class NZ(NewZealand):
|
|
pass
|
|
|
|
|
|
class NZL(NewZealand):
|
|
pass
|
|
|
|
|
|
class NewZelandStaticHolidays:
|
|
special_public_holidays = {
|
|
2022: (SEP, 26, "Queen Elizabeth II Memorial Day"),
|
|
}
|