From 5c93ce7074f52e52c951ae96dc3787cc9b1e8e02 Mon Sep 17 00:00:00 2001 From: Arkadii Yakovets Date: Mon, 7 Oct 2024 12:31:41 -0700 Subject: [PATCH 01/24] Initialize v0.59 --- holidays/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/holidays/__init__.py b/holidays/__init__.py index e97984831..21f68aa4b 100644 --- a/holidays/__init__.py +++ b/holidays/__init__.py @@ -23,7 +23,7 @@ from holidays.registry import EntityLoader from holidays.utils import * -__version__ = "0.58" +__version__ = "0.59" EntityLoader.load("countries", globals()) From 7335779b37ad9f4fb2f808a0ca3868c8273c8f80 Mon Sep 17 00:00:00 2001 From: Panpakorn Siripanich <19505219+PPsyrius@users.noreply.github.com> Date: Fri, 11 Oct 2024 08:35:26 +0700 Subject: [PATCH 02/24] Drop Python 3.8 support (#2042) --- .github/workflows/ci-cd.yml | 1 - .pre-commit-config.yaml | 2 +- docs/source/conf.py | 4 +- holidays/calendars/buddhist.py | 8 ++-- holidays/calendars/chinese.py | 16 +++---- holidays/calendars/hindu.py | 8 ++-- holidays/calendars/islamic.py | 50 ++++++++++---------- holidays/countries/angola.py | 4 +- holidays/countries/bulgaria.py | 3 +- holidays/countries/chile.py | 3 +- holidays/countries/hongkong.py | 3 +- holidays/countries/japan.py | 7 ++- holidays/countries/jersey.py | 4 +- holidays/countries/saudi_arabia.py | 3 +- holidays/countries/south_korea.py | 3 +- holidays/countries/taiwan.py | 3 +- holidays/countries/united_kingdom.py | 4 +- holidays/countries/united_states.py | 4 +- holidays/groups/buddhist.py | 4 +- holidays/groups/chinese.py | 4 +- holidays/groups/hindu.py | 4 +- holidays/groups/islamic.py | 70 ++++++++++++++-------------- holidays/holiday_base.py | 61 ++++++++++++------------ holidays/mixins.py | 5 +- holidays/observed_holiday_base.py | 10 ++-- holidays/registry.py | 7 +-- holidays/utils.py | 15 +++--- pyproject.toml | 2 +- requirements/tests.txt | 5 +- scripts/generate_release_notes.py | 5 +- tests/common.py | 2 +- tox.ini | 2 +- 32 files changed, 158 insertions(+), 168 deletions(-) diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index 9ce3d4825..ccfe7f171 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -72,7 +72,6 @@ jobs: - ubuntu-latest - windows-latest python-version: - - '3.8' - '3.9' - '3.10' - '3.11' diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3477d2de9..e30b14b1c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,7 +20,7 @@ repos: hooks: - id: pyupgrade args: - - --py38-plus + - --py39-plus - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.6.9 diff --git a/docs/source/conf.py b/docs/source/conf.py index f7d08c877..c2760e6bc 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -72,7 +72,7 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. -exclude_patterns: List[str] = [] +exclude_patterns: list[str] = [] # Add any paths that contain templates here, relative to this directory. # @@ -144,7 +144,7 @@ # # See https://sphinx-rtd-theme.readthedocs.io/en/latest/configuring.html # -html_theme_options: Dict[str, Union[str, bool, int]] = { +html_theme_options: dict[str, Union[str, bool, int]] = { # 'canonical_url': '', # 'analytics_id': 'UA-XXXXXXX-1', # Provided by Google in your dashboard # 'analytics_anonymize_ip': False diff --git a/holidays/calendars/buddhist.py b/holidays/calendars/buddhist.py index ddf4cf24c..8e78c16b6 100644 --- a/holidays/calendars/buddhist.py +++ b/holidays/calendars/buddhist.py @@ -11,7 +11,7 @@ # License: MIT (see LICENSE file) from datetime import date -from typing import Optional, Tuple +from typing import Optional from holidays.calendars.custom import _CustomCalendar from holidays.calendars.gregorian import MAY, JUN @@ -425,16 +425,16 @@ class _BuddhistLunisolar: 2099: (MAY, 4), } - def _get_holiday(self, holiday: str, year: int) -> Tuple[Optional[date], bool]: + def _get_holiday(self, holiday: str, year: int) -> tuple[Optional[date], bool]: estimated_dates = getattr(self, f"{holiday}_DATES", {}) exact_dates = getattr(self, f"{holiday}_DATES_{_CustomCalendar.CUSTOM_ATTR_POSTFIX}", {}) dt = exact_dates.get(year, estimated_dates.get(year, ())) return date(year, *dt) if dt else None, year not in exact_dates - def vesak_date(self, year: int) -> Tuple[Optional[date], bool]: + def vesak_date(self, year: int) -> tuple[Optional[date], bool]: return self._get_holiday(VESAK, year) - def vesak_may_date(self, year: int) -> Tuple[Optional[date], bool]: + def vesak_may_date(self, year: int) -> tuple[Optional[date], bool]: return self._get_holiday(VESAK_MAY, year) diff --git a/holidays/calendars/chinese.py b/holidays/calendars/chinese.py index e37509daa..f4a48d50f 100644 --- a/holidays/calendars/chinese.py +++ b/holidays/calendars/chinese.py @@ -11,7 +11,7 @@ # License: MIT (see LICENSE file) from datetime import date -from typing import Optional, Tuple +from typing import Optional from holidays.calendars.custom import _CustomCalendar from holidays.calendars.gregorian import JAN, FEB, MAR, APR, MAY, JUN, SEP, OCT, NOV @@ -1237,28 +1237,28 @@ class _ChineseLunisolar: 2099: (SEP, 29), } - def _get_holiday(self, holiday: str, year: int) -> Tuple[Optional[date], bool]: + def _get_holiday(self, holiday: str, year: int) -> tuple[Optional[date], bool]: estimated_dates = getattr(self, f"{holiday}_DATES", {}) exact_dates = getattr(self, f"{holiday}_DATES_{_CustomCalendar.CUSTOM_ATTR_POSTFIX}", {}) dt = exact_dates.get(year, estimated_dates.get(year, ())) return date(year, *dt) if dt else None, year not in exact_dates - def buddha_birthday_date(self, year: int) -> Tuple[Optional[date], bool]: + def buddha_birthday_date(self, year: int) -> tuple[Optional[date], bool]: return self._get_holiday(BUDDHA_BIRTHDAY, year) - def double_ninth_date(self, year: int) -> Tuple[Optional[date], bool]: + def double_ninth_date(self, year: int) -> tuple[Optional[date], bool]: return self._get_holiday(DOUBLE_NINTH, year) - def dragon_boat_date(self, year: int) -> Tuple[Optional[date], bool]: + def dragon_boat_date(self, year: int) -> tuple[Optional[date], bool]: return self._get_holiday(DRAGON_BOAT, year) - def hung_kings_date(self, year: int) -> Tuple[Optional[date], bool]: + def hung_kings_date(self, year: int) -> tuple[Optional[date], bool]: return self._get_holiday(HUNG_KINGS, year) - def lunar_new_year_date(self, year: int) -> Tuple[Optional[date], bool]: + def lunar_new_year_date(self, year: int) -> tuple[Optional[date], bool]: return self._get_holiday(LUNAR_NEW_YEAR, year) - def mid_autumn_date(self, year: int) -> Tuple[Optional[date], bool]: + def mid_autumn_date(self, year: int) -> tuple[Optional[date], bool]: return self._get_holiday(MID_AUTUMN, year) diff --git a/holidays/calendars/hindu.py b/holidays/calendars/hindu.py index bd7bd4a4f..949eaef4a 100644 --- a/holidays/calendars/hindu.py +++ b/holidays/calendars/hindu.py @@ -11,7 +11,7 @@ # License: MIT (see LICENSE file) from datetime import date -from typing import Optional, Tuple +from typing import Optional from holidays.calendars.custom import _CustomCalendar from holidays.calendars.gregorian import JAN, FEB, MAR, OCT, NOV @@ -425,16 +425,16 @@ class _HinduLunisolar: 2099: (JAN, 6), } - def _get_holiday(self, holiday: str, year: int) -> Tuple[Optional[date], bool]: + def _get_holiday(self, holiday: str, year: int) -> tuple[Optional[date], bool]: estimated_dates = getattr(self, f"{holiday}_DATES", {}) exact_dates = getattr(self, f"{holiday}_DATES_{_CustomCalendar.CUSTOM_ATTR_POSTFIX}", {}) dt = exact_dates.get(year, estimated_dates.get(year, ())) return date(year, *dt) if dt else None, year not in exact_dates - def diwali_date(self, year: int) -> Tuple[Optional[date], bool]: + def diwali_date(self, year: int) -> tuple[Optional[date], bool]: return self._get_holiday(DIWALI, year) - def thaipusam_date(self, year: int) -> Tuple[Optional[date], bool]: + def thaipusam_date(self, year: int) -> tuple[Optional[date], bool]: return self._get_holiday(THAIPUSAM, year) diff --git a/holidays/calendars/islamic.py b/holidays/calendars/islamic.py index b18488c27..e6054a3d3 100644 --- a/holidays/calendars/islamic.py +++ b/holidays/calendars/islamic.py @@ -10,8 +10,8 @@ # Website: https://github.com/vacanza/holidays # License: MIT (see LICENSE file) +from collections.abc import Iterable from datetime import date -from typing import Iterable, Tuple from holidays.calendars.custom import _CustomCalendar from holidays.calendars.gregorian import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC @@ -3641,80 +3641,80 @@ class _IslamicLunar: 2076: (DEC, 5), } - def _get_holiday(self, holiday: str, year: int) -> Iterable[Tuple[date, bool]]: + def _get_holiday(self, holiday: str, year: int) -> Iterable[tuple[date, bool]]: estimated_dates = getattr(self, f"{holiday}_DATES", {}) exact_dates = getattr(self, f"{holiday}_DATES_{_CustomCalendar.CUSTOM_ATTR_POSTFIX}", {}) for year in (year - 1, year): for dt in _normalize_tuple(exact_dates.get(year, estimated_dates.get(year, ()))): yield date(year, *dt), year not in exact_dates - def ali_al_rida_death_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def ali_al_rida_death_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(ALI_AL_RIDA_DEATH, year) - def ali_birthday_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def ali_birthday_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(ALI_BIRTHDAY, year) - def ali_death_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def ali_death_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(ALI_DEATH, year) - def arbaeen_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def arbaeen_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(ARBAEEN, year) - def ashura_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def ashura_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(ASHURA, year) - def eid_al_adha_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def eid_al_adha_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(EID_AL_ADHA, year) - def eid_al_fitr_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def eid_al_fitr_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(EID_AL_FITR, year) - def eid_al_ghadir_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def eid_al_ghadir_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(EID_AL_GHADIR, year) - def fatima_death_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def fatima_death_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(FATIMA_DEATH, year) - def hari_hol_johor_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def hari_hol_johor_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(HARI_HOL_JOHOR, year) - def hasan_al_askari_death_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def hasan_al_askari_death_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(HASAN_AL_ASKARI_DEATH, year) - def hijri_new_year_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def hijri_new_year_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(HIJRI_NEW_YEAR, year) - def imam_mahdi_birthday_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def imam_mahdi_birthday_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(IMAM_MAHDI_BIRTHDAY, year) - def isra_and_miraj_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def isra_and_miraj_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(ISRA_AND_MIRAJ, year) - def maldives_embraced_islam_day_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def maldives_embraced_islam_day_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(MALDIVES_EMBRACED_ISLAM_DAY, year) - def mawlid_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def mawlid_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(MAWLID, year) - def nuzul_al_quran_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def nuzul_al_quran_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(NUZUL_AL_QURAN, year) - def prophet_death_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def prophet_death_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(PROPHET_DEATH, year) - def quamee_dhuvas_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def quamee_dhuvas_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(QUAMEE_DHUVAS, year) - def ramadan_beginning_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def ramadan_beginning_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(RAMADAN_BEGINNING, year) - def sadiq_birthday_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def sadiq_birthday_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(SADIQ_BIRTHDAY, year) - def sadiq_death_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def sadiq_death_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(SADIQ_DEATH, year) - def tasua_dates(self, year: int) -> Iterable[Tuple[date, bool]]: + def tasua_dates(self, year: int) -> Iterable[tuple[date, bool]]: return self._get_holiday(TASUA, year) diff --git a/holidays/countries/angola.py b/holidays/countries/angola.py index c113352cc..857f5e4f3 100644 --- a/holidays/countries/angola.py +++ b/holidays/countries/angola.py @@ -12,7 +12,7 @@ from datetime import date from gettext import gettext as tr -from typing import Optional, Tuple +from typing import Optional from holidays.calendars.gregorian import AUG, SEP from holidays.groups import ChristianHolidays, InternationalHolidays, StaticHolidays @@ -59,7 +59,7 @@ def _is_observed(self, dt: date) -> bool: # it rolls over to the following Monday. return dt >= date(1996, SEP, 27) - def _add_observed(self, dt: date, **kwargs) -> Tuple[bool, Optional[date]]: + def _add_observed(self, dt: date, **kwargs) -> tuple[bool, Optional[date]]: # As per Law # #11/18, from 2018/9/10, when public holiday falls on Tuesday or Thursday, # the Monday or Friday is also a holiday. kwargs.setdefault( diff --git a/holidays/countries/bulgaria.py b/holidays/countries/bulgaria.py index 94833b133..d6a75aff9 100644 --- a/holidays/countries/bulgaria.py +++ b/holidays/countries/bulgaria.py @@ -12,7 +12,6 @@ from datetime import date from gettext import gettext as tr -from typing import Set from holidays.calendars.julian_revised import JULIAN_REVISED_CALENDAR from holidays.constants import PUBLIC, SCHOOL @@ -57,7 +56,7 @@ def __init__(self, *args, **kwargs): kwargs.setdefault("observed_since", 2017) super().__init__(*args, **kwargs) - def _populate_observed(self, dts: Set[date], excluded_names: Set[str]) -> None: + def _populate_observed(self, dts: set[date], excluded_names: set[str]) -> None: for dt in sorted(dts): if not self._is_observed(dt): continue diff --git a/holidays/countries/chile.py b/holidays/countries/chile.py index 3e2bea150..d9d49cb18 100644 --- a/holidays/countries/chile.py +++ b/holidays/countries/chile.py @@ -11,7 +11,6 @@ # License: MIT (see LICENSE file) from gettext import gettext as tr -from typing import Tuple from holidays.calendars.gregorian import JUN, SEP, DEC from holidays.constants import BANK, PUBLIC @@ -226,7 +225,7 @@ def _populate_bank_holidays(self): self._add_holiday_dec_31(name) @property - def _summer_solstice_date(self) -> Tuple[int, int]: + def _summer_solstice_date(self) -> tuple[int, int]: day = 20 if (self._year % 4 > 1 and self._year <= 2046) or ( self._year % 4 > 2 and self._year <= 2075 diff --git a/holidays/countries/hongkong.py b/holidays/countries/hongkong.py index b6a57b371..8d02f8c92 100644 --- a/holidays/countries/hongkong.py +++ b/holidays/countries/hongkong.py @@ -11,7 +11,6 @@ # License: MIT (see LICENSE file) from datetime import date -from typing import Tuple from holidays.calendars.gregorian import ( JAN, @@ -416,7 +415,7 @@ def _populate_optional_holidays(self): self._add_holiday_aug_30(name) @property - def _winter_solstice_date(self) -> Tuple[int, int]: + def _winter_solstice_date(self) -> tuple[int, int]: # This approximation is reliable for 1952-2099 years. if ( (self._year % 4 == 0 and self._year >= 1988) diff --git a/holidays/countries/japan.py b/holidays/countries/japan.py index de8da4beb..1de0ca1a7 100644 --- a/holidays/countries/japan.py +++ b/holidays/countries/japan.py @@ -12,7 +12,6 @@ from datetime import date from gettext import gettext as tr -from typing import Set, Tuple from holidays.calendars.gregorian import ( FEB, @@ -54,7 +53,7 @@ def __init__(self, *args, **kwargs) -> None: def _is_observed(self, dt: date) -> bool: return dt >= date(1973, APR, 12) - def _populate_observed(self, dts: Set[date]) -> None: + def _populate_observed(self, dts: set[date]) -> None: # When a national holiday falls on Sunday, next working day # shall become a public holiday (振替休日) - substitute holiday. for dt in sorted(dts): @@ -211,7 +210,7 @@ def _populate_bank_holidays(self): self._add_new_years_eve(name) @property - def _vernal_equinox_date(self) -> Tuple[int, int]: + def _vernal_equinox_date(self) -> tuple[int, int]: day = 20 if ( (self._year % 4 == 0 and self._year <= 1956) @@ -225,7 +224,7 @@ def _vernal_equinox_date(self) -> Tuple[int, int]: return MAR, day @property - def _autumnal_equinox_date(self) -> Tuple[int, int]: + def _autumnal_equinox_date(self) -> tuple[int, int]: day = 23 if self._year % 4 == 3 and self._year <= 1979: day = 24 diff --git a/holidays/countries/jersey.py b/holidays/countries/jersey.py index c79630b53..e2e89590d 100644 --- a/holidays/countries/jersey.py +++ b/holidays/countries/jersey.py @@ -11,7 +11,7 @@ # License: MIT (see LICENSE file) from datetime import date -from typing import Optional, Tuple +from typing import Optional from holidays.calendars.gregorian import JAN, APR, MAY, JUN, JUL, SEP, OCT, DEC from holidays.groups import ChristianHolidays, InternationalHolidays, StaticHolidays @@ -56,7 +56,7 @@ def __init__(self, *args, **kwargs): kwargs.setdefault("observed_rule", SAT_SUN_TO_NEXT_WORKDAY) ObservedHolidayBase.__init__(self, *args, **kwargs) - def _add_observed(self, dt: date, **kwargs) -> Tuple[bool, Optional[date]]: + def _add_observed(self, dt: date, **kwargs) -> tuple[bool, Optional[date]]: # Prior to 2004, in-lieu are only given for Sundays. # https://www.jerseylaw.je/laws/enacted/Pages/RO-123-2004.aspx kwargs.setdefault( diff --git a/holidays/countries/saudi_arabia.py b/holidays/countries/saudi_arabia.py index 78c2d64cc..4d1bb10a1 100644 --- a/holidays/countries/saudi_arabia.py +++ b/holidays/countries/saudi_arabia.py @@ -12,7 +12,6 @@ from datetime import date from gettext import gettext as tr -from typing import Set from holidays.calendars.gregorian import JAN, FEB, SEP, NOV, THU, FRI, SAT, _timedelta from holidays.groups import IslamicHolidays, StaticHolidays @@ -58,7 +57,7 @@ def __init__(self, *args, **kwargs): kwargs.setdefault("observed_rule", FRI_TO_PREV_THU + SAT_TO_NEXT_SUN) super().__init__(*args, **kwargs) - def _add_islamic_observed(self, dts: Set[date]) -> None: + def _add_islamic_observed(self, dts: set[date]) -> None: # Observed days are added to make up for any days falling on a weekend. if not self.observed: return None diff --git a/holidays/countries/south_korea.py b/holidays/countries/south_korea.py index 7505322b4..8e1441da9 100644 --- a/holidays/countries/south_korea.py +++ b/holidays/countries/south_korea.py @@ -13,7 +13,6 @@ import warnings from datetime import date from gettext import gettext as tr -from typing import Dict, Set from holidays.calendars import _CustomChineseHolidays from holidays.calendars.gregorian import ( @@ -103,7 +102,7 @@ def __init__(self, *args, **kwargs): kwargs.setdefault("observed_since", 2014) super().__init__(*args, **kwargs) - def _populate_observed(self, dts: Set[date], three_day_holidays: Dict[date, str]) -> None: + def _populate_observed(self, dts: set[date], three_day_holidays: dict[date, str]) -> None: for dt in sorted(dts.union(three_day_holidays.keys())): if not self._is_observed(dt): continue diff --git a/holidays/countries/taiwan.py b/holidays/countries/taiwan.py index f87ab7432..e1203ff45 100644 --- a/holidays/countries/taiwan.py +++ b/holidays/countries/taiwan.py @@ -12,7 +12,6 @@ from datetime import date from gettext import gettext as tr -from typing import Set from holidays.calendars.gregorian import ( JAN, @@ -80,7 +79,7 @@ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def _populate_observed( - self, dts: Set[date], rule: ObservedRule = None, since: int = 2015 + self, dts: set[date], rule: ObservedRule = None, since: int = 2015 ) -> None: if self._year < since: return None diff --git a/holidays/countries/united_kingdom.py b/holidays/countries/united_kingdom.py index 729c31c92..d9ed5bda8 100644 --- a/holidays/countries/united_kingdom.py +++ b/holidays/countries/united_kingdom.py @@ -10,7 +10,7 @@ # Website: https://github.com/vacanza/holidays # License: MIT (see LICENSE file) -from typing import Tuple, Union +from typing import Union from holidays.calendars.gregorian import APR, MAY, JUN, JUL, SEP, DEC from holidays.groups import ChristianHolidays, InternationalHolidays, StaticHolidays @@ -38,7 +38,7 @@ class UnitedKingdom(ObservedHolidayBase, ChristianHolidays, InternationalHoliday country = "GB" observed_label = "%s (observed)" - subdivisions: Union[Tuple[()], Tuple[str, ...]] = ( + subdivisions: Union[tuple[()], tuple[str, ...]] = ( "ENG", # England "NIR", # Northern Ireland "SCT", # Scotland diff --git a/holidays/countries/united_states.py b/holidays/countries/united_states.py index 25e960f2c..afdfee5db 100644 --- a/holidays/countries/united_states.py +++ b/holidays/countries/united_states.py @@ -10,7 +10,7 @@ # Website: https://github.com/vacanza/holidays # License: MIT (see LICENSE file) -from typing import Tuple, Union +from typing import Union from holidays.calendars.gregorian import MON, TUE, WED, THU, FRI, SAT, SUN from holidays.constants import PUBLIC, UNOFFICIAL @@ -62,7 +62,7 @@ class UnitedStates(ObservedHolidayBase, ChristianHolidays, InternationalHolidays country = "US" supported_categories = (PUBLIC, UNOFFICIAL) observed_label = "%s (observed)" - subdivisions: Union[Tuple[()], Tuple[str, ...]] = ( + subdivisions: Union[tuple[()], tuple[str, ...]] = ( "AK", # Alaska. "AL", # Alabama. "AR", # Arkansas. diff --git a/holidays/groups/buddhist.py b/holidays/groups/buddhist.py index 47394dd20..c537d0de5 100644 --- a/holidays/groups/buddhist.py +++ b/holidays/groups/buddhist.py @@ -11,7 +11,7 @@ # License: MIT (see LICENSE file) from datetime import date -from typing import Optional, Tuple +from typing import Optional from holidays.calendars import _BuddhistLunisolar @@ -26,7 +26,7 @@ def __init__(self, cls=None, show_estimated=False) -> None: self._buddhist_calendar_show_estimated = show_estimated def _add_buddhist_calendar_holiday( - self, name: str, dt_estimated: Tuple[date, bool] + self, name: str, dt_estimated: tuple[date, bool] ) -> Optional[date]: """ Add Buddhist calendar holiday. diff --git a/holidays/groups/chinese.py b/holidays/groups/chinese.py index f9abbd5a7..5563c7e64 100644 --- a/holidays/groups/chinese.py +++ b/holidays/groups/chinese.py @@ -11,7 +11,7 @@ # License: MIT (see LICENSE file) from datetime import date -from typing import Optional, Tuple +from typing import Optional from holidays.calendars import _ChineseLunisolar from holidays.calendars.gregorian import APR, _timedelta @@ -48,7 +48,7 @@ def _mid_autumn_festival(self): return self._chinese_calendar.mid_autumn_date(self._year)[0] def _add_chinese_calendar_holiday( - self, name: str, dt_estimated: Tuple[date, bool], days_delta: int = 0 + self, name: str, dt_estimated: tuple[date, bool], days_delta: int = 0 ) -> Optional[date]: """ Add Chinese calendar holiday. diff --git a/holidays/groups/hindu.py b/holidays/groups/hindu.py index 2e6e29640..933b397e5 100644 --- a/holidays/groups/hindu.py +++ b/holidays/groups/hindu.py @@ -11,7 +11,7 @@ # License: MIT (see LICENSE file) from datetime import date -from typing import Optional, Tuple +from typing import Optional from holidays.calendars import _HinduLunisolar @@ -26,7 +26,7 @@ def __init__(self, cls=None, show_estimated=False) -> None: self._hindu_calendar_show_estimated = show_estimated def _add_hindu_calendar_holiday( - self, name: str, dt_estimated: Tuple[date, bool] + self, name: str, dt_estimated: tuple[date, bool] ) -> Optional[date]: """ Add Hindu calendar holiday. diff --git a/holidays/groups/islamic.py b/holidays/groups/islamic.py index 8e3b23588..7fef07410 100644 --- a/holidays/groups/islamic.py +++ b/holidays/groups/islamic.py @@ -10,8 +10,8 @@ # Website: https://github.com/vacanza/holidays # License: MIT (see LICENSE file) +from collections.abc import Iterable from datetime import date -from typing import Iterable, Set, Tuple from holidays.calendars import _IslamicLunar from holidays.calendars.gregorian import _timedelta @@ -28,7 +28,7 @@ class IslamicHolidays: def __init__(self, cls=None) -> None: self._islamic_calendar = cls() if cls else _IslamicLunar() - def _add_ali_al_rida_death_day(self, name) -> Set[date]: + def _add_ali_al_rida_death_day(self, name) -> set[date]: """ Add death of Ali al-Rida day (last (29th or 30th) day of 2nd month). @@ -38,7 +38,7 @@ def _add_ali_al_rida_death_day(self, name) -> Set[date]: name, self._islamic_calendar.ali_al_rida_death_dates(self._year) ) - def _add_ali_birthday_day(self, name) -> Set[date]: + def _add_ali_birthday_day(self, name) -> set[date]: """ Add birthday of Ali ibn Abu Talib day (13th day of 7th month). @@ -48,7 +48,7 @@ def _add_ali_birthday_day(self, name) -> Set[date]: name, self._islamic_calendar.ali_birthday_dates(self._year) ) - def _add_ali_death_day(self, name) -> Set[date]: + def _add_ali_death_day(self, name) -> set[date]: """ Add death of Ali ibn Abu Talib day (21st day of 9th month). @@ -58,7 +58,7 @@ def _add_ali_death_day(self, name) -> Set[date]: name, self._islamic_calendar.ali_death_dates(self._year) ) - def _add_arbaeen_day(self, name) -> Set[date]: + def _add_arbaeen_day(self, name) -> set[date]: """ Add Arbaeen day (20th day of 2nd month). @@ -68,7 +68,7 @@ def _add_arbaeen_day(self, name) -> Set[date]: name, self._islamic_calendar.arbaeen_dates(self._year) ) - def _add_arafah_day(self, name) -> Set[date]: + def _add_arafah_day(self, name) -> set[date]: """ Add Day of Arafah (9th day of 12th month). @@ -81,7 +81,7 @@ def _add_arafah_day(self, name) -> Set[date]: name, self._islamic_calendar.eid_al_adha_dates(self._year), days_delta=-1 ) - def _add_ashura_day(self, name) -> Set[date]: + def _add_ashura_day(self, name) -> set[date]: """ Add Ashura Day (10th day of 1st month). @@ -93,7 +93,7 @@ def _add_ashura_day(self, name) -> Set[date]: name, self._islamic_calendar.ashura_dates(self._year) ) - def _add_ashura_eve(self, name) -> Set[date]: + def _add_ashura_eve(self, name) -> set[date]: """ Add Ashura Eve (Day before the 10th day of 1st month). @@ -105,7 +105,7 @@ def _add_ashura_eve(self, name) -> Set[date]: name, self._islamic_calendar.ashura_dates(self._year), days_delta=-1 ) - def _add_eid_al_adha_day(self, name) -> Set[date]: + def _add_eid_al_adha_day(self, name) -> set[date]: """ Add Eid al-Adha Day (10th day of the 12th month of Islamic calendar). @@ -118,7 +118,7 @@ def _add_eid_al_adha_day(self, name) -> Set[date]: name, self._islamic_calendar.eid_al_adha_dates(self._year) ) - def _add_eid_al_adha_day_two(self, name) -> Set[date]: + def _add_eid_al_adha_day_two(self, name) -> set[date]: """ Add Eid al-Adha Day Two. @@ -128,7 +128,7 @@ def _add_eid_al_adha_day_two(self, name) -> Set[date]: name, self._islamic_calendar.eid_al_adha_dates(self._year), days_delta=+1 ) - def _add_eid_al_adha_day_three(self, name) -> Set[date]: + def _add_eid_al_adha_day_three(self, name) -> set[date]: """ Add Eid al-Adha Day Three. @@ -138,7 +138,7 @@ def _add_eid_al_adha_day_three(self, name) -> Set[date]: name, self._islamic_calendar.eid_al_adha_dates(self._year), days_delta=+2 ) - def _add_eid_al_adha_day_four(self, name) -> Set[date]: + def _add_eid_al_adha_day_four(self, name) -> set[date]: """ Add Eid al-Adha Day Four. @@ -148,7 +148,7 @@ def _add_eid_al_adha_day_four(self, name) -> Set[date]: name, self._islamic_calendar.eid_al_adha_dates(self._year), days_delta=+3 ) - def _add_eid_al_fitr_day(self, name) -> Set[date]: + def _add_eid_al_fitr_day(self, name) -> set[date]: """ Add Eid al-Fitr Day (1st day of 10th month of Islamic calendar). @@ -161,7 +161,7 @@ def _add_eid_al_fitr_day(self, name) -> Set[date]: name, self._islamic_calendar.eid_al_fitr_dates(self._year) ) - def _add_eid_al_fitr_day_two(self, name) -> Set[date]: + def _add_eid_al_fitr_day_two(self, name) -> set[date]: """ Add Eid al-Fitr Day Two. @@ -171,7 +171,7 @@ def _add_eid_al_fitr_day_two(self, name) -> Set[date]: name, self._islamic_calendar.eid_al_fitr_dates(self._year), days_delta=+1 ) - def _add_eid_al_fitr_day_three(self, name) -> Set[date]: + def _add_eid_al_fitr_day_three(self, name) -> set[date]: """ Add Eid al-Fitr Day Three. @@ -181,7 +181,7 @@ def _add_eid_al_fitr_day_three(self, name) -> Set[date]: name, self._islamic_calendar.eid_al_fitr_dates(self._year), days_delta=+2 ) - def _add_eid_al_fitr_day_four(self, name) -> Set[date]: + def _add_eid_al_fitr_day_four(self, name) -> set[date]: """ Add Eid al-Fitr Day Four. @@ -191,7 +191,7 @@ def _add_eid_al_fitr_day_four(self, name) -> Set[date]: name, self._islamic_calendar.eid_al_fitr_dates(self._year), days_delta=+3 ) - def _add_eid_al_fitr_eve(self, name) -> Set[date]: + def _add_eid_al_fitr_eve(self, name) -> set[date]: """ Add Eid al-Fitr Eve (last day of 9th month of Islamic calendar). @@ -201,7 +201,7 @@ def _add_eid_al_fitr_eve(self, name) -> Set[date]: name, self._islamic_calendar.eid_al_fitr_dates(self._year), days_delta=-1 ) - def _add_eid_al_ghadir_day(self, name) -> Set[date]: + def _add_eid_al_ghadir_day(self, name) -> set[date]: """ Add Eid al-Ghadir Day (18th day of 12th month). @@ -211,7 +211,7 @@ def _add_eid_al_ghadir_day(self, name) -> Set[date]: name, self._islamic_calendar.eid_al_ghadir_dates(self._year) ) - def _add_fatima_death_day(self, name) -> Set[date]: + def _add_fatima_death_day(self, name) -> set[date]: """ Add death of Fatima day (3rd day of 6th month). @@ -221,7 +221,7 @@ def _add_fatima_death_day(self, name) -> Set[date]: name, self._islamic_calendar.fatima_death_dates(self._year) ) - def _add_hari_hol_johor(self, name) -> Set[date]: + def _add_hari_hol_johor(self, name) -> set[date]: """ Hari Hol Johor. @@ -231,7 +231,7 @@ def _add_hari_hol_johor(self, name) -> Set[date]: name, self._islamic_calendar.hari_hol_johor_dates(self._year) ) - def _add_hasan_al_askari_death_day(self, name) -> Set[date]: + def _add_hasan_al_askari_death_day(self, name) -> set[date]: """ Add death of Hasan_al-Askari day (8th day of 3rd month). @@ -241,7 +241,7 @@ def _add_hasan_al_askari_death_day(self, name) -> Set[date]: name, self._islamic_calendar.hasan_al_askari_death_dates(self._year) ) - def _add_imam_mahdi_birthday_day(self, name) -> Set[date]: + def _add_imam_mahdi_birthday_day(self, name) -> set[date]: """ Add birthday of Muhammad al-Mahdi day (15th day of 8th month). @@ -252,8 +252,8 @@ def _add_imam_mahdi_birthday_day(self, name) -> Set[date]: ) def _add_islamic_calendar_holiday( - self, name: str, dates: Iterable[Tuple[date, bool]], days_delta: int = 0 - ) -> Set[date]: + self, name: str, dates: Iterable[tuple[date, bool]], days_delta: int = 0 + ) -> set[date]: """ Add lunar calendar holiday. @@ -274,7 +274,7 @@ def _add_islamic_calendar_holiday( return added_dates - def _add_islamic_new_year_day(self, name) -> Set[date]: + def _add_islamic_new_year_day(self, name) -> set[date]: """ Add Islamic New Year Day (last day of Dhu al-Hijjah). @@ -299,7 +299,7 @@ def _add_isra_and_miraj_day(self, name): name, self._islamic_calendar.isra_and_miraj_dates(self._year) ) - def _add_maldives_embraced_islam_day(self, name) -> Set[date]: + def _add_maldives_embraced_islam_day(self, name) -> set[date]: """ Add Maldives Embraced Islam Day (1st day of 4th month). @@ -309,7 +309,7 @@ def _add_maldives_embraced_islam_day(self, name) -> Set[date]: name, self._islamic_calendar.maldives_embraced_islam_day_dates(self._year) ) - def _add_mawlid_day(self, name) -> Set[date]: + def _add_mawlid_day(self, name) -> set[date]: """ Add Mawlid Day (12th day of 3rd month). @@ -321,7 +321,7 @@ def _add_mawlid_day(self, name) -> Set[date]: name, self._islamic_calendar.mawlid_dates(self._year) ) - def _add_mawlid_day_two(self, name) -> Set[date]: + def _add_mawlid_day_two(self, name) -> set[date]: """ Add Mawlid Day Two. @@ -333,7 +333,7 @@ def _add_mawlid_day_two(self, name) -> Set[date]: name, self._islamic_calendar.mawlid_dates(self._year), days_delta=+1 ) - def _add_nuzul_al_quran_day(self, name) -> Set[date]: + def _add_nuzul_al_quran_day(self, name) -> set[date]: """ Add Nuzul Al Quran (17th day of 9th month). @@ -346,7 +346,7 @@ def _add_nuzul_al_quran_day(self, name) -> Set[date]: name, self._islamic_calendar.nuzul_al_quran_dates(self._year) ) - def _add_prophet_death_day(self, name) -> Set[date]: + def _add_prophet_death_day(self, name) -> set[date]: """ Add death of Prophet Muhammad and Hasan ibn Ali day (28th day of 2nd month). @@ -356,7 +356,7 @@ def _add_prophet_death_day(self, name) -> Set[date]: name, self._islamic_calendar.prophet_death_dates(self._year) ) - def _add_quamee_dhuvas_day(self, name) -> Set[date]: + def _add_quamee_dhuvas_day(self, name) -> set[date]: """ Add Quamee Dhuvas (1st day of 3rd month). @@ -366,7 +366,7 @@ def _add_quamee_dhuvas_day(self, name) -> Set[date]: name, self._islamic_calendar.quamee_dhuvas_dates(self._year) ) - def _add_ramadan_beginning_day(self, name) -> Set[date]: + def _add_ramadan_beginning_day(self, name) -> set[date]: """ Add First Day of Ramadan (1st day of 9th month). @@ -378,7 +378,7 @@ def _add_ramadan_beginning_day(self, name) -> Set[date]: name, self._islamic_calendar.ramadan_beginning_dates(self._year) ) - def _add_sadiq_birthday_day(self, name) -> Set[date]: + def _add_sadiq_birthday_day(self, name) -> set[date]: """ Add birthday of Prophet Muhammad and Ja'far al-Sadiq day (17th day of 3rd month). @@ -388,7 +388,7 @@ def _add_sadiq_birthday_day(self, name) -> Set[date]: name, self._islamic_calendar.sadiq_birthday_dates(self._year) ) - def _add_sadiq_death_day(self, name) -> Set[date]: + def _add_sadiq_death_day(self, name) -> set[date]: """ Add death of Ja'far al-Sadiq day (25th day of 10th month). @@ -398,7 +398,7 @@ def _add_sadiq_death_day(self, name) -> Set[date]: name, self._islamic_calendar.sadiq_death_dates(self._year) ) - def _add_tasua_day(self, name) -> Set[date]: + def _add_tasua_day(self, name) -> set[date]: """ Add Tasua day (9th day of 1st month). diff --git a/holidays/holiday_base.py b/holidays/holiday_base.py index 10c7e5a89..bd99d2571 100644 --- a/holidays/holiday_base.py +++ b/holidays/holiday_base.py @@ -15,11 +15,12 @@ import copy import warnings from calendar import isleap +from collections.abc import Iterable from datetime import date, datetime, timedelta, timezone from functools import cached_property from gettext import gettext, translation from pathlib import Path -from typing import Any, Dict, Iterable, List, Optional, Set, Tuple, Union, cast +from typing import Any, Dict, Optional, Union, cast from dateutil.parser import parse @@ -42,17 +43,17 @@ from holidays.helpers import _normalize_arguments, _normalize_tuple CategoryArg = Union[str, Iterable[str]] -DateArg = Union[date, Tuple[int, int]] +DateArg = Union[date, tuple[int, int]] DateLike = Union[date, datetime, str, float, int] -SpecialHoliday = Union[Tuple[int, int, str], Tuple[Tuple[int, int, str], ...]] +SpecialHoliday = Union[tuple[int, int, str], tuple[tuple[int, int, str], ...]] SubstitutedHoliday = Union[ - Union[Tuple[int, int, int, int], Tuple[int, int, int, int, int]], - Tuple[Union[Tuple[int, int, int, int], Tuple[int, int, int, int, int]], ...], + Union[tuple[int, int, int, int], tuple[int, int, int, int, int]], + tuple[Union[tuple[int, int, int, int], tuple[int, int, int, int, int]], ...], ] YearArg = Union[int, Iterable[int]] -class HolidayBase(Dict[date, str]): +class HolidayBase(dict[date, str]): """ A dict-like object containing the holidays for a specific country (and province or state if so initiated); inherits the dict class (so behaves @@ -210,12 +211,12 @@ def _populate(self, year): """The country's ISO 3166-1 alpha-2 code.""" market: str """The market's ISO 3166-1 alpha-2 code.""" - subdivisions: Tuple[str, ...] = () + subdivisions: tuple[str, ...] = () """The subdivisions supported for this country (see documentation).""" - subdivisions_aliases: Dict[str, str] = {} + subdivisions_aliases: dict[str, str] = {} """Aliases for the ISO 3166-2 subdivision codes with the key as alias and the value the ISO 3166-2 subdivision code.""" - years: Set[int] + years: set[int] """The years calculated.""" expand: bool """Whether the entire year is calculated when one date from that year @@ -224,25 +225,25 @@ def _populate(self, year): """Whether dates when public holiday are observed are included.""" subdiv: Optional[str] = None """The subdiv requested as ISO 3166-2 code or one of the aliases.""" - special_holidays: Dict[int, Union[SpecialHoliday, SubstitutedHoliday]] = {} + special_holidays: dict[int, Union[SpecialHoliday, SubstitutedHoliday]] = {} """A list of the country-wide special (as opposite to regular) holidays for a specific year.""" - _deprecated_subdivisions: Tuple[str, ...] = () + _deprecated_subdivisions: tuple[str, ...] = () """Other subdivisions whose names are deprecated or aliases of the official ones.""" - weekend: Set[int] = {SAT, SUN} + weekend: set[int] = {SAT, SUN} """Country weekend days.""" - weekend_workdays: Set[date] = set() + weekend_workdays: set[date] = set() """Working days moved to weekends.""" default_category: str = PUBLIC """The entity category used by default.""" default_language: Optional[str] = None """The entity language used by default.""" - categories: Set[str] = set() + categories: set[str] = set() """Requested holiday categories.""" - supported_categories: Tuple[str, ...] = (PUBLIC,) + supported_categories: tuple[str, ...] = (PUBLIC,) """All holiday categories supported by this entity.""" - supported_languages: Tuple[str, ...] = () + supported_languages: tuple[str, ...] = () """All languages supported by this entity.""" def __init__( @@ -630,7 +631,7 @@ def __ne__(self, other: object) -> bool: def __radd__(self, other: Any) -> "HolidayBase": return self.__add__(other) - def __reduce__(self) -> Union[str, Tuple[Any, ...]]: + def __reduce__(self) -> Union[str, tuple[Any, ...]]: return super().__reduce__() def __repr__(self) -> str: @@ -720,9 +721,9 @@ def _sorted_categories(self): ) @classmethod - def get_subdivision_aliases(cls) -> Dict[str, List]: + def get_subdivision_aliases(cls) -> dict[str, list]: """Get subdivision aliases.""" - subdivision_aliases: Dict[str, List[str]] = {s: [] for s in cls.subdivisions} + subdivision_aliases: dict[str, list[str]] = {s: [] for s in cls.subdivisions} for alias, subdivision in cls.subdivisions_aliases.items(): subdivision_aliases[subdivision].append(alias) @@ -862,7 +863,7 @@ def _populate_subdiv_holidays(self): for category in self._sorted_categories ) - def append(self, *args: Union[Dict[DateLike, str], List[DateLike], DateLike]) -> None: + def append(self, *args: Union[dict[DateLike, str], list[DateLike], DateLike]) -> None: """Alias for :meth:`update` to mimic list type.""" return self.update(*args) @@ -891,7 +892,7 @@ def get(self, key: DateLike, default: Union[str, Any] = None) -> Union[str, Any] """ return dict.get(self, self.__keytransform__(key), default) - def get_list(self, key: DateLike) -> List[str]: + def get_list(self, key: DateLike) -> list[str]: """Return a list of all holiday names for a date if date is a holiday, else empty string. @@ -909,7 +910,7 @@ def get_list(self, key: DateLike) -> List[str]: def get_named( self, holiday_name: str, lookup="icontains", split_multiple_names=True - ) -> List[date]: + ) -> list[date]: """Return a list of all holiday dates matching the provided holiday name. The match will be made case insensitively and partial matches will be included by default. @@ -1025,7 +1026,7 @@ def pop(self, key: DateLike, default: Union[str, Any] = None) -> Union[str, Any] return dict.pop(self, self.__keytransform__(key), default) - def pop_named(self, name: str) -> List[date]: + def pop_named(self, name: str) -> list[date]: """Remove (no longer treat at as holiday) all dates matching the provided holiday name. The match will be made case insensitively and partial matches will be removed. @@ -1065,7 +1066,7 @@ def pop_named(self, name: str) -> List[date]: return popped def update( # type: ignore[override] - self, *args: Union[Dict[DateLike, str], List[DateLike], DateLike] + self, *args: Union[dict[DateLike, str], list[DateLike], DateLike] ) -> None: # TODO: fix arguments; should not be *args (cannot properly Type hint) """Update the object, overwriting existing dates. @@ -1105,15 +1106,15 @@ class HolidaySum(HolidayBase): are merged. All years are calculated (expanded) for all operands. """ - country: Union[str, List[str]] # type: ignore[assignment] + country: Union[str, list[str]] # type: ignore[assignment] """Countries included in the addition.""" - market: Union[str, List[str]] # type: ignore[assignment] + market: Union[str, list[str]] # type: ignore[assignment] """Markets included in the addition.""" - subdiv: Optional[Union[str, List[str]]] # type: ignore[assignment] + subdiv: Optional[Union[str, list[str]]] # type: ignore[assignment] """Subdivisions included in the addition.""" - holidays: List[HolidayBase] + holidays: list[HolidayBase] """The original HolidayBase objects included in the addition.""" - years: Set[int] + years: set[int] """The years calculated.""" def __init__( @@ -1153,7 +1154,7 @@ def __init__( else: self.holidays.append(operand) - kwargs: Dict[str, Any] = {} + kwargs: dict[str, Any] = {} # Join years, expand and observed. kwargs["years"] = h1.years | h2.years kwargs["expand"] = h1.expand or h2.expand diff --git a/holidays/mixins.py b/holidays/mixins.py index 524e6e05d..6be995b7f 100644 --- a/holidays/mixins.py +++ b/holidays/mixins.py @@ -11,16 +11,13 @@ # License: MIT (see LICENSE file) -from typing import Tuple - - class PreferredDiscretionaryHolidays: """A mixin for setting preferred discretionary holidays. See :class:`holidays.countries.hongkong.HongKong` for an example. """ - default_preferred_discretionary_holidays: Tuple[str, ...] = () + default_preferred_discretionary_holidays: tuple[str, ...] = () """Preferred discretionary holidays defaults.""" def __init__(self, preferred_discretionary_holidays): diff --git a/holidays/observed_holiday_base.py b/holidays/observed_holiday_base.py index 6b90ef1cd..eba371c64 100644 --- a/holidays/observed_holiday_base.py +++ b/holidays/observed_holiday_base.py @@ -11,13 +11,13 @@ # License: MIT (see LICENSE file) from datetime import date -from typing import Dict, Optional, Tuple, Set +from typing import Optional from holidays.calendars.gregorian import MON, TUE, WED, THU, FRI, SAT, SUN, _timedelta from holidays.holiday_base import DateArg, HolidayBase -class ObservedRule(Dict[int, Optional[int]]): +class ObservedRule(dict[int, Optional[int]]): __slots__ = () def __add__(self, other): @@ -141,7 +141,7 @@ def _add_observed( name: Optional[str] = None, rule: Optional[ObservedRule] = None, show_observed_label: bool = True, - ) -> Tuple[bool, Optional[date]]: + ) -> tuple[bool, Optional[date]]: dt = dt if isinstance(dt, date) else date(self._year, *dt) if not self.observed or not self._is_observed(dt): @@ -186,7 +186,7 @@ def _add_observed( def _move_holiday( self, dt: date, rule: Optional[ObservedRule] = None, show_observed_label: bool = True - ) -> Tuple[bool, Optional[date]]: + ) -> tuple[bool, Optional[date]]: is_observed, dt_observed = self._add_observed( dt, rule=rule, show_observed_label=show_observed_label ) @@ -194,7 +194,7 @@ def _move_holiday( self.pop(dt) return is_observed, dt_observed if is_observed else dt - def _populate_observed(self, dts: Set[date], multiple: bool = False) -> None: + def _populate_observed(self, dts: set[date], multiple: bool = False) -> None: """ When multiple is True, each holiday from a given date has its own observed date. """ diff --git a/holidays/registry.py b/holidays/registry.py index c127df9fb..f6ab6d9fb 100644 --- a/holidays/registry.py +++ b/holidays/registry.py @@ -11,12 +11,13 @@ # License: MIT (see LICENSE file) import importlib +from collections.abc import Iterable from threading import RLock -from typing import Any, Dict, Iterable, Optional, Tuple, Union +from typing import Any, Optional, Union from holidays.holiday_base import HolidayBase -RegistryDict = Dict[str, Tuple[str, ...]] +RegistryDict = dict[str, tuple[str, ...]] COUNTRIES: RegistryDict = { "albania": ("Albania", "AL", "ALB"), @@ -277,7 +278,7 @@ def get_financial_codes(include_aliases: bool = True) -> Iterable[str]: return EntityLoader._get_entity_codes(FINANCIAL, (3, 4), include_aliases) @staticmethod - def load(prefix: str, scope: Dict) -> None: + def load(prefix: str, scope: dict) -> None: """Load country or financial entities.""" entity_mapping = COUNTRIES if prefix == "countries" else FINANCIAL for module, entities in entity_mapping.items(): diff --git a/holidays/utils.py b/holidays/utils.py index 249141f8b..694c7766c 100755 --- a/holidays/utils.py +++ b/holidays/utils.py @@ -21,8 +21,9 @@ ) import warnings +from collections.abc import Iterable from functools import lru_cache -from typing import Dict, Iterable, List, Optional, Union +from typing import Optional, Union from holidays.holiday_base import CategoryArg, HolidayBase from holidays.registry import EntityLoader @@ -282,7 +283,7 @@ def CountryHoliday( # noqa: N802 return country_holidays(country, subdiv, years, expand, observed, prov, state) -def _list_localized_entities(entity_codes: Iterable[str]) -> Dict[str, List[str]]: +def _list_localized_entities(entity_codes: Iterable[str]) -> dict[str, list[str]]: """ Get all localized entities and languages they support. @@ -307,7 +308,7 @@ def _list_localized_entities(entity_codes: Iterable[str]) -> Dict[str, List[str] @lru_cache -def list_localized_countries(include_aliases=True) -> Dict[str, List[str]]: +def list_localized_countries(include_aliases=True) -> dict[str, list[str]]: """ Get all localized countries and languages they support. @@ -324,7 +325,7 @@ def list_localized_countries(include_aliases=True) -> Dict[str, List[str]]: @lru_cache -def list_localized_financial(include_aliases=True) -> Dict[str, List[str]]: +def list_localized_financial(include_aliases=True) -> dict[str, list[str]]: """ Get all localized financial markets and languages they support. @@ -339,7 +340,7 @@ def list_localized_financial(include_aliases=True) -> Dict[str, List[str]]: return _list_localized_entities(EntityLoader.get_financial_codes(include_aliases)) -def _list_supported_entities(entity_codes: Iterable[str]) -> Dict[str, List[str]]: +def _list_supported_entities(entity_codes: Iterable[str]) -> dict[str, list[str]]: """ Get all supported entities and their subdivisions. @@ -359,7 +360,7 @@ def _list_supported_entities(entity_codes: Iterable[str]) -> Dict[str, List[str] @lru_cache -def list_supported_countries(include_aliases=True) -> Dict[str, List[str]]: +def list_supported_countries(include_aliases=True) -> dict[str, list[str]]: """ Get all supported countries and their subdivisions. @@ -374,7 +375,7 @@ def list_supported_countries(include_aliases=True) -> Dict[str, List[str]]: @lru_cache -def list_supported_financial(include_aliases=True) -> Dict[str, List[str]]: +def list_supported_financial(include_aliases=True) -> dict[str, list[str]]: """ Get all supported financial markets and their subdivisions. diff --git a/pyproject.toml b/pyproject.toml index 2ecee71c0..be5daac88 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ name = "holidays" description = "Generate and work with holidays in Python" license = { file = "LICENSE" } readme = "README.rst" -requires-python = ">=3.8" +requires-python = ">=3.9" dynamic = ["version"] authors = [{ email = "dr.prodigy.github@gmail.com", name = "Maurizio Montel" }] diff --git a/requirements/tests.txt b/requirements/tests.txt index 4e4d502ea..c200380fe 100644 --- a/requirements/tests.txt +++ b/requirements/tests.txt @@ -2,9 +2,8 @@ coverage==7.6.1 importlib-metadata==8.5.0 -numpy<2.0.0; python_version < '3.9' -numpy==2.0.2; python_version == '3.9' -numpy==2.1.1; python_version > '3.9' +numpy<2.1.0; python_version < '3.10' +numpy==2.1.2; python_version >= '3.10' polib==1.2.0 pytest-cov==5.0.0 pytest-xdist==3.6.1 diff --git a/scripts/generate_release_notes.py b/scripts/generate_release_notes.py index 0b6e4deb4..00afa096c 100755 --- a/scripts/generate_release_notes.py +++ b/scripts/generate_release_notes.py @@ -17,7 +17,6 @@ import sys from datetime import date from pathlib import Path -from typing import Dict, Set from git import Repo from github import Github @@ -83,8 +82,8 @@ def __init__(self) -> None: self.local_repo = Repo(Path.cwd()) self.remote_repo = Github(self.github_token).get_repo(REPOSITORY_NAME) - self.previous_commits: Set[str] = set() - self.pull_requests: Dict[int, str] = {} + self.previous_commits: set[str] = set() + self.pull_requests: dict[int, str] = {} self.tag = holidays.__version__ diff --git a/tests/common.py b/tests/common.py index 731217a62..358ea0e77 100644 --- a/tests/common.py +++ b/tests/common.py @@ -14,8 +14,8 @@ import os import sys import warnings +from collections.abc import Generator from datetime import date -from typing import Generator from dateutil.parser import parse diff --git a/tox.ini b/tox.ini index 659414144..948238fdf 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,7 @@ requires = env_list = docs pre-commit - python3.{13, 12, 11, 10, 9, 8} + python3.{13, 12, 11, 10, 9} skip_missing_interpreters = true [testenv] From df48f79e0428a7161784c0fb5f000e08d7be87fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 18:59:09 -0700 Subject: [PATCH 03/24] Bump ruff from 0.6.8 to 0.6.9 (#2044) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Arkadii Yakovets <2201626+arkid15r@users.noreply.github.com> --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 8bb67420d..8c49a8fac 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -7,7 +7,7 @@ hijridate==2.5.0 lingva==5.0.4 pre-commit==3.8.0 pygithub==2.4.0 -ruff==0.6.8 +ruff==0.6.9 tox==4.21.1 urllib3>=2.2.2 # not directly required, pinned by Snyk to avoid a vulnerability zipp>=3.19.1 # not directly required, pinned by Snyk to avoid a vulnerability From 041c7ae2659f77f67d04953e464fa626ae7b69f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 19:15:47 -0700 Subject: [PATCH 04/24] Bump coverage from 7.6.1 to 7.6.2 (#2043) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements/tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/tests.txt b/requirements/tests.txt index c200380fe..89ca23270 100644 --- a/requirements/tests.txt +++ b/requirements/tests.txt @@ -1,6 +1,6 @@ # Test requirements. -coverage==7.6.1 +coverage==7.6.2 importlib-metadata==8.5.0 numpy<2.1.0; python_version < '3.10' numpy==2.1.2; python_version >= '3.10' From 3fc5f29b9c19e631d07ec717a26e41c34c44a4ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 19:16:41 -0700 Subject: [PATCH 05/24] Bump pre-commit from 3.8.0 to 4.0.1 (#2046) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 8c49a8fac..e11bc16ee 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -5,7 +5,7 @@ convertdate==2.4.0 gitpython==3.1.43 hijridate==2.5.0 lingva==5.0.4 -pre-commit==3.8.0 +pre-commit==4.0.1 pygithub==2.4.0 ruff==0.6.9 tox==4.21.1 From b364590092222fbd0fef34e4b5e7906659a48e80 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 18:16:40 -0700 Subject: [PATCH 06/24] Update pre-commit hooks (#2050) Co-authored-by: arkid15r <2201626+arkid15r@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e30b14b1c..e60438f96 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -16,7 +16,7 @@ repos: - rst - repo: https://github.com/asottile/pyupgrade - rev: v3.17.0 + rev: v3.18.0 hooks: - id: pyupgrade args: From 3238cb75cd0607ab11541e05bf9ba4a3f0ec15c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 12 Oct 2024 01:13:52 +0000 Subject: [PATCH 07/24] Bump tox from 4.21.1 to 4.21.2 (#2045) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index e11bc16ee..c0f5cdab4 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -8,6 +8,6 @@ lingva==5.0.4 pre-commit==4.0.1 pygithub==2.4.0 ruff==0.6.9 -tox==4.21.1 +tox==4.21.2 urllib3>=2.2.2 # not directly required, pinned by Snyk to avoid a vulnerability zipp>=3.19.1 # not directly required, pinned by Snyk to avoid a vulnerability From 3d2f6b09f369827ca4d3e32de933412e74bf48b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 18:23:41 -0700 Subject: [PATCH 08/24] Bump build from 1.2.2 to 1.2.2.post1 (#2047) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements/build.txt | 2 +- requirements/dev.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements/build.txt b/requirements/build.txt index 8e99acc34..4d8c3604c 100644 --- a/requirements/build.txt +++ b/requirements/build.txt @@ -1,3 +1,3 @@ -build==1.2.2 +build==1.2.2.post1 cyclonedx-bom==4.6.1 polib==1.2.0 diff --git a/requirements/dev.txt b/requirements/dev.txt index c0f5cdab4..1d109d7c4 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,6 +1,6 @@ # Dev requirements. -build==1.2.2 +build==1.2.2.post1 convertdate==2.4.0 gitpython==3.1.43 hijridate==2.5.0 From ebe2ca086d27108b8662060b1894875f5f43c9c8 Mon Sep 17 00:00:00 2001 From: Panpakorn Siripanich <19505219+PPsyrius@users.noreply.github.com> Date: Sat, 12 Oct 2024 21:04:33 +0700 Subject: [PATCH 09/24] Update Johor (Malaysia) and United Arab Emirates `weekend` observance, cleanup others (#2048) Co-authored-by: ~Jhellico --- holidays/countries/egypt.py | 1 - holidays/countries/jordan.py | 2 +- holidays/countries/kuwait.py | 2 +- holidays/countries/malaysia.py | 8 +- holidays/countries/mauritania.py | 1 - holidays/countries/united_arab_emirates.py | 7 +- snapshots/countries/MY_01.json | 173 +++++++++++---------- 7 files changed, 105 insertions(+), 89 deletions(-) diff --git a/holidays/countries/egypt.py b/holidays/countries/egypt.py index 3fe78a236..16c082f6d 100644 --- a/holidays/countries/egypt.py +++ b/holidays/countries/egypt.py @@ -39,7 +39,6 @@ def __init__(self, *args, **kwargs): ChristianHolidays.__init__(self, JULIAN_CALENDAR) InternationalHolidays.__init__(self) IslamicHolidays.__init__(self) - super().__init__(*args, **kwargs) def _populate_public_holidays(self): diff --git a/holidays/countries/jordan.py b/holidays/countries/jordan.py index e7ab398e5..e0218a64b 100644 --- a/holidays/countries/jordan.py +++ b/holidays/countries/jordan.py @@ -39,7 +39,7 @@ def __init__(self, *args, **kwargs): def _populate_public_holidays(self): # The resting days are Friday and Saturday since Jan 6, 2000. # https://archive.wfn.org/2000/01/msg00078.html - self.weekend = {FRI, SAT} if self._year >= 2000 else {THU, FRI} + self.weekend = {THU, FRI} if self._year <= 1999 else {FRI, SAT} # New Year's Day. self._add_new_years_day(tr("رأس السنة الميلادية")) diff --git a/holidays/countries/kuwait.py b/holidays/countries/kuwait.py index 20155f5a1..57cca90ea 100644 --- a/holidays/countries/kuwait.py +++ b/holidays/countries/kuwait.py @@ -39,7 +39,7 @@ def __init__(self, *args, **kwargs): def _populate_public_holidays(self): # The resting days are Friday and Saturday since Sep 1, 2007. # https://www.arabnews.com/node/298933 - self.weekend = {FRI, SAT} if self._year >= 2007 else {THU, FRI} + self.weekend = {THU, FRI} if self._year <= 2006 else {FRI, SAT} # New Year's Day. self._add_new_years_day(tr("رأس السنة الميلادية")) diff --git a/holidays/countries/malaysia.py b/holidays/countries/malaysia.py index 98eebfc80..5d1eb7ef1 100644 --- a/holidays/countries/malaysia.py +++ b/holidays/countries/malaysia.py @@ -33,6 +33,7 @@ DEC, FRI, SAT, + SUN, ) from holidays.groups import ( BuddhistCalendarHolidays, @@ -220,12 +221,17 @@ def _populate_subdiv_holidays(self): super()._populate_subdiv_holidays() - if self.subdiv in {"01", "02"}: + if ( + self.subdiv == "01" and (self._year <= 1994 or 2014 <= self._year <= 2024) + ) or self.subdiv == "02": self._observed_rule = FRI_TO_NEXT_WORKDAY self.weekend = {FRI, SAT} elif self.subdiv in {"03", "11"}: self._observed_rule = SAT_TO_NEXT_WORKDAY self.weekend = {FRI, SAT} + else: + self._observed_rule = SUN_TO_NEXT_WORKDAY + self.weekend = {SAT, SUN} if self.observed: self._populate_observed(self.dts_observed) diff --git a/holidays/countries/mauritania.py b/holidays/countries/mauritania.py index 58274826c..40156adbc 100644 --- a/holidays/countries/mauritania.py +++ b/holidays/countries/mauritania.py @@ -28,7 +28,6 @@ class Mauritania(HolidayBase, InternationalHolidays, IslamicHolidays): def __init__(self, *args, **kwargs): InternationalHolidays.__init__(self) IslamicHolidays.__init__(self) - super().__init__(*args, **kwargs) def _populate(self, year): diff --git a/holidays/countries/united_arab_emirates.py b/holidays/countries/united_arab_emirates.py index bf290c741..83ca817ad 100644 --- a/holidays/countries/united_arab_emirates.py +++ b/holidays/countries/united_arab_emirates.py @@ -13,7 +13,7 @@ from gettext import gettext as tr from holidays.calendars import _CustomIslamicHolidays -from holidays.calendars.gregorian import APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, FRI, SAT +from holidays.calendars.gregorian import APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, FRI, SAT, SUN from holidays.groups import InternationalHolidays, IslamicHolidays from holidays.holiday_base import HolidayBase @@ -35,7 +35,6 @@ class UnitedArabEmirates(HolidayBase, InternationalHolidays, IslamicHolidays): # %s (estimated). estimated_label = tr("(تقدير) %s") supported_languages = ("ar", "en_US") - weekend = {FRI, SAT} def __init__(self, *args, **kwargs): InternationalHolidays.__init__(self) @@ -43,6 +42,10 @@ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def _populate_public_holidays(self): + # The resting days are Saturday and Sunday since Jan 1, 2022. + # https://time.com/6126260/uae-working-days-weekend/ + self.weekend = {FRI, SAT} if self._year <= 2021 else {SAT, SUN} + # New Year's Day. self._add_new_years_day(tr("رأس السنة الميلادية")) diff --git a/snapshots/countries/MY_01.json b/snapshots/countries/MY_01.json index 7ed012e28..6e3aadfe7 100644 --- a/snapshots/countries/MY_01.json +++ b/snapshots/countries/MY_01.json @@ -657,10 +657,10 @@ "1995-02-14": "Thaipusam", "1995-03-02": "Eid al-Fitr (estimated)", "1995-03-03": "Eid al-Fitr (Second Day) (estimated)", - "1995-03-05": "Eid al-Fitr (Second Day) (observed, estimated)", "1995-05-01": "Labor Day", "1995-05-09": "Eid al-Adha (estimated)", "1995-05-14": "Vesak Day (estimated)", + "1995-05-15": "Vesak Day (observed, estimated)", "1995-05-30": "Islamic New Year (estimated)", "1995-06-03": "Birthday of HM Yang di-Pertuan Agong", "1995-08-08": "Prophet Muhammad's Birthday (estimated)", @@ -668,6 +668,7 @@ "1995-11-20": "Deepavali", "1995-12-25": "Christmas Day", "1996-01-21": "Beginning of Ramadan (estimated)", + "1996-01-22": "Beginning of Ramadan (observed, estimated)", "1996-02-19": "Chinese New Year (estimated); Eid al-Fitr (estimated)", "1996-02-20": "Chinese New Year (Second Day) (estimated); Eid al-Fitr (Second Day) (estimated)", "1996-03-04": "Thaipusam", @@ -681,11 +682,10 @@ "1996-11-09": "Deepavali", "1996-12-25": "Christmas Day", "1997-01-10": "Beginning of Ramadan (estimated)", - "1997-01-12": "Beginning of Ramadan (observed, estimated)", "1997-02-07": "Chinese New Year (estimated)", "1997-02-08": "Chinese New Year (Second Day) (estimated); Eid al-Fitr (estimated)", "1997-02-09": "Eid al-Fitr (Second Day) (estimated)", - "1997-02-10": "Chinese New Year (observed, estimated)", + "1997-02-10": "Eid al-Fitr (Second Day) (observed, estimated)", "1997-02-22": "Thaipusam", "1997-04-17": "Eid al-Adha (estimated)", "1997-05-01": "Labor Day", @@ -694,6 +694,7 @@ "1997-06-07": "Birthday of HM Yang di-Pertuan Agong", "1997-07-16": "Prophet Muhammad's Birthday (estimated)", "1997-08-31": "National Day", + "1997-09-01": "National Day (observed)", "1997-10-29": "Deepavali", "1997-12-25": "Christmas Day", "1997-12-30": "Beginning of Ramadan (estimated)", @@ -701,19 +702,17 @@ "1998-01-28": "Chinese New Year (estimated)", "1998-01-29": "Chinese New Year (Second Day) (estimated); Eid al-Fitr (estimated)", "1998-01-30": "Eid al-Fitr (Second Day) (estimated)", - "1998-02-01": "Eid al-Fitr (Second Day) (observed, estimated)", "1998-04-07": "Eid al-Adha (estimated)", "1998-04-27": "Islamic New Year (estimated)", "1998-05-01": "Labor Day", - "1998-05-03": "Labor Day (observed)", "1998-05-10": "Vesak Day (estimated)", + "1998-05-11": "Vesak Day (observed, estimated)", "1998-06-06": "Birthday of HM Yang di-Pertuan Agong", "1998-07-06": "Prophet Muhammad's Birthday (estimated)", "1998-08-31": "National Day", "1998-11-17": "Deepavali", "1998-12-19": "Beginning of Ramadan (estimated)", "1998-12-25": "Christmas Day", - "1998-12-27": "Christmas Day (observed)", "1999-01-18": "Eid al-Fitr (estimated)", "1999-01-19": "Eid al-Fitr (Second Day) (estimated)", "1999-02-16": "Chinese New Year (estimated)", @@ -732,9 +731,12 @@ "1999-12-25": "Christmas Day", "2000-01-08": "Eid al-Fitr (estimated)", "2000-01-09": "Eid al-Fitr (Second Day) (estimated)", + "2000-01-10": "Eid al-Fitr (Second Day) (observed, estimated)", "2000-02-05": "Chinese New Year (estimated)", "2000-02-06": "Chinese New Year (Second Day) (estimated)", + "2000-02-07": "Chinese New Year (Second Day) (observed, estimated)", "2000-02-20": "Thaipusam", + "2000-02-21": "Thaipusam (observed)", "2000-03-16": "Eid al-Adha (estimated)", "2000-04-06": "Islamic New Year (estimated)", "2000-05-01": "Labor Day", @@ -757,7 +759,6 @@ "2001-06-02": "Birthday of HM Yang di-Pertuan Agong", "2001-06-04": "Prophet Muhammad's Birthday", "2001-08-31": "National Day", - "2001-09-02": "National Day (observed)", "2001-11-14": "Deepavali", "2001-11-17": "Beginning of Ramadan", "2001-12-17": "Eid al-Fitr", @@ -770,26 +771,28 @@ "2002-03-15": "Islamic New Year", "2002-05-01": "Labor Day", "2002-05-24": "Prophet Muhammad's Birthday", - "2002-05-26": "Prophet Muhammad's Birthday (observed)", "2002-05-27": "Vesak Day", "2002-06-01": "Birthday of HM Yang di-Pertuan Agong", "2002-08-31": "National Day", "2002-11-03": "Deepavali", + "2002-11-04": "Deepavali (observed)", "2002-11-06": "Beginning of Ramadan", "2002-12-06": "Eid al-Fitr", "2002-12-07": "Eid al-Fitr (Second Day)", - "2002-12-08": "Eid al-Fitr (observed)", "2002-12-25": "Christmas Day", "2003-02-01": "Chinese New Year", "2003-02-02": "Chinese New Year (Second Day)", + "2003-02-03": "Chinese New Year (Second Day) (observed)", "2003-02-12": "Eid al-Adha", "2003-02-16": "Thaipusam", + "2003-02-17": "Thaipusam (observed)", "2003-03-05": "Islamic New Year", "2003-05-01": "Labor Day", "2003-05-14": "Prophet Muhammad's Birthday", "2003-05-15": "Vesak Day", "2003-06-07": "Birthday of HM Yang di-Pertuan Agong", "2003-08-31": "National Day", + "2003-09-01": "National Day (observed)", "2003-10-23": "Deepavali", "2003-10-27": "Beginning of Ramadan", "2003-11-26": "Eid al-Fitr", @@ -798,47 +801,50 @@ "2004-01-07": "Thaipusam", "2004-01-22": "Chinese New Year", "2004-01-23": "Chinese New Year (Second Day)", - "2004-01-25": "Chinese New Year (Second Day) (observed)", "2004-02-02": "Eid al-Adha", "2004-02-22": "Islamic New Year", "2004-05-01": "Labor Day", "2004-05-02": "Prophet Muhammad's Birthday", "2004-05-03": "Vesak Day", + "2004-05-04": "Prophet Muhammad's Birthday (observed)", "2004-06-05": "Birthday of HM Yang di-Pertuan Agong", "2004-08-31": "National Day", "2004-10-16": "Beginning of Ramadan", "2004-11-11": "Deepavali", "2004-11-14": "Eid al-Fitr", "2004-11-15": "Eid al-Fitr (Second Day)", + "2004-11-16": "Eid al-Fitr (observed)", "2004-12-25": "Christmas Day", "2005-01-21": "Eid al-Adha", - "2005-01-23": "Eid al-Adha (observed)", "2005-02-09": "Chinese New Year", "2005-02-10": "Chinese New Year (Second Day); Islamic New Year", "2005-02-23": "Thaipusam", "2005-04-21": "Prophet Muhammad's Birthday", "2005-05-01": "Labor Day", + "2005-05-02": "Labor Day (observed)", "2005-05-22": "Vesak Day", + "2005-05-23": "Vesak Day (observed)", "2005-06-04": "Birthday of HM Yang di-Pertuan Agong", "2005-08-31": "National Day", "2005-10-05": "Beginning of Ramadan", "2005-11-01": "Deepavali", "2005-11-03": "Eid al-Fitr", "2005-11-04": "Eid al-Fitr (Second Day)", - "2005-11-06": "Eid al-Fitr (Second Day) (observed)", "2005-12-25": "Christmas Day", + "2005-12-26": "Christmas Day (observed)", "2006-01-10": "Eid al-Adha", "2006-01-29": "Chinese New Year", "2006-01-30": "Chinese New Year (Second Day)", "2006-01-31": "Islamic New Year", + "2006-02-01": "Chinese New Year (observed)", "2006-02-13": "Thaipusam", "2006-04-11": "Prophet Muhammad's Birthday", "2006-05-01": "Labor Day", "2006-05-12": "Vesak Day", - "2006-05-14": "Vesak Day (observed)", "2006-06-03": "Birthday of HM Yang di-Pertuan Agong", "2006-08-31": "National Day", "2006-09-24": "Beginning of Ramadan", + "2006-09-25": "Beginning of Ramadan (observed)", "2006-10-21": "Deepavali", "2006-10-24": "Eid al-Fitr", "2006-10-25": "Eid al-Fitr (Second Day)", @@ -847,29 +853,30 @@ "2007-01-20": "Islamic New Year", "2007-02-18": "Chinese New Year", "2007-02-19": "Chinese New Year (Second Day)", + "2007-02-20": "Chinese New Year (observed)", "2007-03-04": "Thaipusam", + "2007-03-05": "Thaipusam (observed)", "2007-03-31": "Prophet Muhammad's Birthday", "2007-05-01": "Labor Day; Vesak Day", "2007-06-02": "Birthday of HM Yang di-Pertuan Agong", "2007-08-31": "National Day", - "2007-09-02": "National Day (observed)", "2007-09-13": "Beginning of Ramadan", "2007-10-13": "Eid al-Fitr", "2007-10-14": "Eid al-Fitr (Second Day)", + "2007-10-15": "Eid al-Fitr (Second Day) (observed)", "2007-11-08": "Deepavali", "2007-12-20": "Eid al-Adha", "2007-12-25": "Christmas Day", "2008-01-10": "Islamic New Year", "2008-02-07": "Chinese New Year", "2008-02-08": "Chinese New Year (Second Day)", - "2008-02-10": "Chinese New Year (Second Day) (observed)", "2008-02-22": "Thaipusam", - "2008-02-24": "Thaipusam (observed)", "2008-03-20": "Prophet Muhammad's Birthday", "2008-05-01": "Labor Day", "2008-05-19": "Vesak Day", "2008-06-07": "Birthday of HM Yang di-Pertuan Agong", "2008-08-31": "National Day", + "2008-09-01": "National Day (observed)", "2008-09-02": "Beginning of Ramadan", "2008-10-01": "Eid al-Fitr", "2008-10-02": "Eid al-Fitr (Second Day)", @@ -878,77 +885,74 @@ "2008-12-25": "Christmas Day", "2008-12-29": "Islamic New Year", "2009-01-11": "Thaipusam", + "2009-01-12": "Thaipusam (observed)", "2009-01-26": "Chinese New Year", "2009-01-27": "Chinese New Year (Second Day)", "2009-03-09": "Prophet Muhammad's Birthday", "2009-05-01": "Labor Day", - "2009-05-03": "Labor Day (observed)", "2009-05-09": "Vesak Day", "2009-06-06": "Birthday of HM Yang di-Pertuan Agong", "2009-08-22": "Beginning of Ramadan", "2009-08-31": "National Day", "2009-09-20": "Eid al-Fitr", "2009-09-21": "Eid al-Fitr (Second Day)", + "2009-09-22": "Eid al-Fitr (observed)", "2009-10-17": "Deepavali", "2009-11-28": "Eid al-Adha", "2009-12-18": "Islamic New Year", "2009-12-25": "Christmas Day", - "2009-12-27": "Christmas Day (observed)", "2010-02-14": "Chinese New Year", "2010-02-15": "Chinese New Year (Second Day)", + "2010-02-16": "Chinese New Year (observed)", "2010-02-26": "Prophet Muhammad's Birthday", - "2010-02-28": "Prophet Muhammad's Birthday (observed)", "2010-03-01": "Thaipusam", "2010-05-01": "Labor Day", "2010-05-28": "Vesak Day", - "2010-05-30": "Vesak Day (observed)", "2010-06-05": "Birthday of HM Yang di-Pertuan Agong", "2010-08-11": "Beginning of Ramadan", "2010-08-31": "National Day", "2010-09-10": "Eid al-Fitr", "2010-09-11": "Eid al-Fitr (Second Day)", - "2010-09-12": "Eid al-Fitr (observed)", "2010-09-16": "Malaysia Day", "2010-11-05": "Deepavali", - "2010-11-07": "Deepavali (observed)", "2010-11-17": "Eid al-Adha", "2010-12-08": "Islamic New Year", "2010-12-25": "Christmas Day", "2011-01-12": "The Sultan of Johor Hol", "2011-02-03": "Chinese New Year", "2011-02-04": "Chinese New Year (Second Day)", - "2011-02-06": "Chinese New Year (Second Day) (observed)", "2011-02-16": "Prophet Muhammad's Birthday", "2011-02-18": "Thaipusam", - "2011-02-20": "Thaipusam (observed)", "2011-05-01": "Labor Day", + "2011-05-02": "Labor Day (observed)", "2011-05-17": "Vesak Day", "2011-06-04": "Birthday of HM Yang di-Pertuan Agong", "2011-08-01": "Beginning of Ramadan", "2011-08-31": "Eid al-Fitr; National Day", "2011-09-01": "Eid al-Fitr (Second Day)", "2011-09-16": "Malaysia Day", - "2011-09-18": "Malaysia Day (observed)", "2011-10-26": "Deepavali", "2011-11-07": "Eid al-Adha", "2011-11-27": "Islamic New Year", "2011-12-25": "Christmas Day", + "2011-12-26": "Christmas Day (observed)", "2012-01-08": "Thaipusam", + "2012-01-09": "Thaipusam (observed)", "2012-01-23": "Chinese New Year", "2012-01-24": "Chinese New Year (Second Day)", "2012-02-05": "Prophet Muhammad's Birthday", + "2012-02-06": "Prophet Muhammad's Birthday (observed)", "2012-05-01": "Labor Day", "2012-05-05": "Vesak Day", "2012-06-02": "Birthday of HM Yang di-Pertuan Agong", "2012-07-20": "Beginning of Ramadan", - "2012-07-22": "Beginning of Ramadan (observed)", "2012-08-19": "Eid al-Fitr", "2012-08-20": "Eid al-Fitr (Second Day)", + "2012-08-21": "Eid al-Fitr (observed)", "2012-08-31": "National Day", - "2012-09-02": "National Day (observed)", "2012-09-16": "Malaysia Day", + "2012-09-17": "Malaysia Day (observed)", "2012-10-26": "Eid al-Adha", - "2012-10-28": "Eid al-Adha (observed)", "2012-11-13": "Deepavali", "2012-11-15": "Islamic New Year", "2012-12-20": "The Sultan of Johor Hol", @@ -956,15 +960,14 @@ "2013-01-24": "Prophet Muhammad's Birthday", "2013-02-10": "Chinese New Year", "2013-02-11": "Chinese New Year (Second Day)", + "2013-02-12": "Chinese New Year (observed)", "2013-02-25": "Thaipusam", "2013-05-01": "Labor Day", "2013-05-24": "Vesak Day", - "2013-05-26": "Vesak Day (observed)", "2013-06-01": "Birthday of HM Yang di-Pertuan Agong", "2013-07-09": "Beginning of Ramadan", "2013-08-08": "Eid al-Fitr", "2013-08-09": "Eid al-Fitr (Second Day)", - "2013-08-11": "Eid al-Fitr (Second Day) (observed)", "2013-08-31": "National Day", "2013-09-16": "Malaysia Day", "2013-10-15": "Eid al-Adha", @@ -1204,27 +1207,28 @@ "2025-03-23": "Birthday of the Sultan of Johor", "2025-03-30": "Eid al-Fitr (estimated)", "2025-03-31": "Eid al-Fitr (Second Day) (estimated)", + "2025-04-01": "Eid al-Fitr (observed, estimated)", "2025-05-01": "Labor Day", "2025-05-11": "Vesak Day (estimated)", + "2025-05-12": "Vesak Day (observed, estimated)", "2025-06-02": "Birthday of HM Yang di-Pertuan Agong", "2025-06-06": "Eid al-Adha (estimated)", - "2025-06-08": "Eid al-Adha (observed, estimated)", "2025-06-26": "Islamic New Year (estimated)", "2025-07-31": "The Sultan of Johor Hol (estimated)", "2025-08-31": "National Day", + "2025-09-01": "National Day (observed)", "2025-09-04": "Prophet Muhammad's Birthday (estimated)", "2025-09-16": "Malaysia Day", "2025-11-18": "Deepavali", "2025-12-25": "Christmas Day", "2026-02-01": "Thaipusam", + "2026-02-02": "Thaipusam (observed)", "2026-02-17": "Chinese New Year (estimated)", "2026-02-18": "Beginning of Ramadan (estimated); Chinese New Year (Second Day) (estimated)", "2026-03-20": "Eid al-Fitr (estimated)", "2026-03-21": "Eid al-Fitr (Second Day) (estimated)", - "2026-03-22": "Eid al-Fitr (observed, estimated)", "2026-03-23": "Birthday of the Sultan of Johor", "2026-05-01": "Labor Day; Vesak Day (estimated)", - "2026-05-03": "Labor Day (observed); Vesak Day (observed, estimated)", "2026-05-27": "Eid al-Adha (estimated)", "2026-06-01": "Birthday of HM Yang di-Pertuan Agong", "2026-06-16": "Islamic New Year (estimated)", @@ -1234,17 +1238,17 @@ "2026-09-16": "Malaysia Day", "2026-11-07": "Deepavali", "2026-12-25": "Christmas Day", - "2026-12-27": "Christmas Day (observed)", "2027-01-22": "Thaipusam", - "2027-01-24": "Thaipusam (observed)", "2027-02-06": "Chinese New Year (estimated)", "2027-02-07": "Chinese New Year (Second Day) (estimated)", "2027-02-08": "Beginning of Ramadan (estimated)", + "2027-02-09": "Chinese New Year (Second Day) (observed, estimated)", "2027-03-09": "Eid al-Fitr (estimated)", "2027-03-10": "Eid al-Fitr (Second Day) (estimated)", "2027-03-23": "Birthday of the Sultan of Johor", "2027-05-01": "Labor Day", "2027-05-16": "Eid al-Adha (estimated)", + "2027-05-17": "Eid al-Adha (observed, estimated)", "2027-05-20": "Vesak Day (estimated)", "2027-06-06": "Islamic New Year (estimated)", "2027-06-07": "Birthday of HM Yang di-Pertuan Agong", @@ -1258,13 +1262,12 @@ "2028-01-26": "Chinese New Year (estimated)", "2028-01-27": "Chinese New Year (Second Day) (estimated)", "2028-01-28": "Beginning of Ramadan (estimated)", - "2028-01-30": "Beginning of Ramadan (observed, estimated)", "2028-02-26": "Eid al-Fitr (estimated)", "2028-02-27": "Eid al-Fitr (Second Day) (estimated)", + "2028-02-28": "Eid al-Fitr (Second Day) (observed, estimated)", "2028-03-23": "Birthday of the Sultan of Johor", "2028-05-01": "Labor Day", "2028-05-05": "Eid al-Adha (estimated)", - "2028-05-07": "Eid al-Adha (observed, estimated)", "2028-05-09": "Vesak Day (estimated)", "2028-05-25": "Islamic New Year (estimated)", "2028-06-05": "Birthday of HM Yang di-Pertuan Agong", @@ -1284,19 +1287,23 @@ "2029-05-01": "Labor Day", "2029-05-14": "Islamic New Year (estimated)", "2029-05-27": "Vesak Day (estimated)", + "2029-05-28": "Vesak Day (observed, estimated)", "2029-06-04": "Birthday of HM Yang di-Pertuan Agong", "2029-06-18": "The Sultan of Johor Hol (estimated)", "2029-07-24": "Prophet Muhammad's Birthday (estimated)", "2029-08-31": "National Day", - "2029-09-02": "National Day (observed)", "2029-09-16": "Malaysia Day", + "2029-09-17": "Malaysia Day (observed)", "2029-11-04": "Deepavali", + "2029-11-05": "Deepavali (observed)", "2029-12-25": "Christmas Day", "2030-01-05": "Beginning of Ramadan (estimated)", "2030-02-03": "Chinese New Year (estimated)", "2030-02-04": "Chinese New Year (Second Day) (estimated); Eid al-Fitr (estimated)", "2030-02-05": "Eid al-Fitr (Second Day) (estimated)", + "2030-02-06": "Chinese New Year (observed, estimated)", "2030-02-17": "Thaipusam", + "2030-02-18": "Thaipusam (observed)", "2030-03-23": "Birthday of the Sultan of Johor", "2030-04-13": "Eid al-Adha (estimated)", "2030-05-01": "Labor Day", @@ -1308,14 +1315,12 @@ "2030-08-31": "National Day", "2030-09-16": "Malaysia Day", "2030-10-25": "Deepavali", - "2030-10-27": "Deepavali (observed)", "2030-12-25": "Christmas Day", "2030-12-26": "Beginning of Ramadan (estimated)", "2031-01-08": "Thaipusam", "2031-01-23": "Chinese New Year (estimated)", "2031-01-24": "Chinese New Year (Second Day) (estimated); Eid al-Fitr (estimated)", "2031-01-25": "Eid al-Fitr (Second Day) (estimated)", - "2031-01-26": "Chinese New Year (Second Day) (observed, estimated); Eid al-Fitr (observed, estimated)", "2031-03-23": "Birthday of the Sultan of Johor", "2031-04-02": "Eid al-Adha (estimated)", "2031-04-23": "Islamic New Year (estimated)", @@ -1325,6 +1330,7 @@ "2031-06-02": "Birthday of HM Yang di-Pertuan Agong", "2031-07-02": "Prophet Muhammad's Birthday (estimated)", "2031-08-31": "National Day", + "2031-09-01": "National Day (observed)", "2031-09-16": "Malaysia Day", "2031-11-13": "Deepavali", "2031-12-15": "Beginning of Ramadan (estimated)", @@ -1340,8 +1346,10 @@ "2032-05-01": "Labor Day", "2032-05-15": "The Sultan of Johor Hol (estimated)", "2032-05-23": "Vesak Day (estimated)", + "2032-05-24": "Vesak Day (observed, estimated)", "2032-06-07": "Birthday of HM Yang di-Pertuan Agong", "2032-06-20": "Prophet Muhammad's Birthday (estimated)", + "2032-06-21": "Prophet Muhammad's Birthday (observed, estimated)", "2032-08-31": "National Day", "2032-09-16": "Malaysia Day", "2032-11-01": "Deepavali", @@ -1349,33 +1357,33 @@ "2032-12-25": "Christmas Day", "2033-01-02": "Eid al-Fitr (estimated)", "2033-01-03": "Eid al-Fitr (Second Day) (estimated)", + "2033-01-04": "Eid al-Fitr (observed, estimated)", "2033-01-31": "Chinese New Year (estimated)", "2033-02-01": "Chinese New Year (Second Day) (estimated)", "2033-02-14": "Thaipusam", "2033-03-11": "Eid al-Adha (estimated)", - "2033-03-13": "Eid al-Adha (observed, estimated)", "2033-03-23": "Birthday of the Sultan of Johor", "2033-04-01": "Islamic New Year (estimated)", "2033-05-01": "Labor Day", + "2033-05-02": "Labor Day (observed)", "2033-05-05": "The Sultan of Johor Hol (estimated)", "2033-05-13": "Vesak Day (estimated)", - "2033-05-15": "Vesak Day (observed, estimated)", "2033-06-06": "Birthday of HM Yang di-Pertuan Agong", "2033-06-09": "Prophet Muhammad's Birthday (estimated)", "2033-08-31": "National Day", "2033-09-16": "Malaysia Day", - "2033-09-18": "Malaysia Day (observed)", "2033-10-21": "Deepavali", - "2033-10-23": "Deepavali (observed)", "2033-11-23": "Beginning of Ramadan (estimated)", "2033-12-23": "Eid al-Fitr (estimated)", "2033-12-24": "Eid al-Fitr (Second Day) (estimated)", "2033-12-25": "Christmas Day", - "2033-12-26": "Eid al-Fitr (observed, estimated)", + "2033-12-26": "Christmas Day (observed)", "2034-02-19": "Chinese New Year (estimated)", "2034-02-20": "Chinese New Year (Second Day) (estimated)", + "2034-02-21": "Chinese New Year (observed, estimated)", "2034-03-01": "Eid al-Adha (estimated)", "2034-03-05": "Thaipusam", + "2034-03-06": "Thaipusam (observed)", "2034-03-21": "Islamic New Year (estimated)", "2034-03-23": "Birthday of the Sultan of Johor", "2034-04-25": "The Sultan of Johor Hol (estimated)", @@ -1387,31 +1395,34 @@ "2034-09-16": "Malaysia Day", "2034-11-09": "Deepavali", "2034-11-12": "Beginning of Ramadan (estimated)", + "2034-11-13": "Beginning of Ramadan (observed, estimated)", "2034-12-12": "Eid al-Fitr (estimated)", "2034-12-13": "Eid al-Fitr (Second Day) (estimated)", "2034-12-25": "Christmas Day", "2035-02-08": "Chinese New Year (estimated)", "2035-02-09": "Chinese New Year (Second Day) (estimated)", - "2035-02-11": "Chinese New Year (Second Day) (observed, estimated)", "2035-02-18": "Eid al-Adha (estimated)", + "2035-02-19": "Eid al-Adha (observed, estimated)", "2035-02-23": "Thaipusam", - "2035-02-25": "Thaipusam (observed)", "2035-03-11": "Islamic New Year (estimated)", "2035-03-23": "Birthday of the Sultan of Johor", "2035-04-14": "The Sultan of Johor Hol (estimated)", "2035-05-01": "Labor Day", "2035-05-20": "Prophet Muhammad's Birthday (estimated)", + "2035-05-21": "Prophet Muhammad's Birthday (observed, estimated)", "2035-05-22": "Vesak Day (estimated)", "2035-06-04": "Birthday of HM Yang di-Pertuan Agong", "2035-08-31": "National Day", - "2035-09-02": "National Day (observed)", "2035-09-16": "Malaysia Day", + "2035-09-17": "Malaysia Day (observed)", "2035-10-29": "Deepavali", "2035-11-01": "Beginning of Ramadan (estimated)", "2035-12-01": "Eid al-Fitr (estimated)", "2035-12-02": "Eid al-Fitr (Second Day) (estimated)", + "2035-12-03": "Eid al-Fitr (Second Day) (observed, estimated)", "2035-12-25": "Christmas Day", "2036-01-13": "Thaipusam", + "2036-01-14": "Thaipusam (observed)", "2036-01-28": "Chinese New Year (estimated)", "2036-01-29": "Chinese New Year (Second Day) (estimated)", "2036-02-07": "Eid al-Adha (estimated)", @@ -1423,22 +1434,23 @@ "2036-05-10": "Vesak Day (estimated)", "2036-06-02": "Birthday of HM Yang di-Pertuan Agong", "2036-08-31": "National Day", + "2036-09-01": "National Day (observed)", "2036-09-16": "Malaysia Day", "2036-10-20": "Beginning of Ramadan (estimated)", "2036-11-16": "Deepavali", + "2036-11-17": "Deepavali (observed)", "2036-11-19": "Eid al-Fitr (estimated)", "2036-11-20": "Eid al-Fitr (Second Day) (estimated)", "2036-12-25": "Christmas Day", "2037-01-26": "Eid al-Adha (estimated)", "2037-02-15": "Chinese New Year (estimated)", "2037-02-16": "Chinese New Year (Second Day) (estimated); Islamic New Year (estimated)", + "2037-02-17": "Chinese New Year (observed, estimated)", "2037-03-02": "Thaipusam", "2037-03-23": "Birthday of the Sultan of Johor; The Sultan of Johor Hol (estimated)", "2037-04-28": "Prophet Muhammad's Birthday (estimated)", "2037-05-01": "Labor Day", - "2037-05-03": "Labor Day (observed)", "2037-05-29": "Vesak Day (estimated)", - "2037-05-31": "Vesak Day (observed, estimated)", "2037-06-01": "Birthday of HM Yang di-Pertuan Agong", "2037-08-31": "National Day", "2037-09-16": "Malaysia Day", @@ -1446,14 +1458,12 @@ "2037-11-05": "Deepavali", "2037-11-08": "Eid al-Fitr (estimated)", "2037-11-09": "Eid al-Fitr (Second Day) (estimated)", + "2037-11-10": "Eid al-Fitr (observed, estimated)", "2037-12-25": "Christmas Day", - "2037-12-27": "Christmas Day (observed)", "2038-01-16": "Eid al-Adha (estimated)", "2038-02-04": "Chinese New Year (estimated)", "2038-02-05": "Chinese New Year (Second Day) (estimated); Islamic New Year (estimated)", - "2038-02-07": "Chinese New Year (Second Day) (observed, estimated); Islamic New Year (observed, estimated)", "2038-02-19": "Thaipusam", - "2038-02-21": "Thaipusam (observed)", "2038-03-12": "The Sultan of Johor Hol (estimated)", "2038-03-23": "Birthday of the Sultan of Johor", "2038-04-17": "Prophet Muhammad's Birthday (estimated)", @@ -1466,10 +1476,10 @@ "2038-10-26": "Deepavali", "2038-10-29": "Eid al-Fitr (estimated)", "2038-10-30": "Eid al-Fitr (Second Day) (estimated)", - "2038-10-31": "Eid al-Fitr (observed, estimated)", "2038-12-25": "Christmas Day", "2039-01-05": "Eid al-Adha (estimated)", "2039-01-09": "Thaipusam", + "2039-01-10": "Thaipusam (observed)", "2039-01-24": "Chinese New Year (estimated)", "2039-01-25": "Chinese New Year (Second Day) (estimated)", "2039-01-26": "Islamic New Year (estimated)", @@ -1477,48 +1487,46 @@ "2039-03-23": "Birthday of the Sultan of Johor", "2039-04-06": "Prophet Muhammad's Birthday (estimated)", "2039-05-01": "Labor Day", + "2039-05-02": "Labor Day (observed)", "2039-05-07": "Vesak Day (estimated)", "2039-06-06": "Birthday of HM Yang di-Pertuan Agong", "2039-08-31": "National Day", "2039-09-16": "Malaysia Day", - "2039-09-18": "Malaysia Day (observed)", "2039-09-19": "Beginning of Ramadan (estimated)", "2039-10-19": "Eid al-Fitr (estimated)", "2039-10-20": "Eid al-Fitr (Second Day) (estimated)", "2039-11-14": "Deepavali", "2039-12-25": "Christmas Day", "2039-12-26": "Eid al-Adha (estimated)", + "2039-12-27": "Christmas Day (observed)", "2040-01-15": "Islamic New Year (estimated)", "2040-02-12": "Chinese New Year (estimated)", "2040-02-13": "Chinese New Year (Second Day) (estimated)", + "2040-02-14": "Chinese New Year (observed, estimated)", "2040-02-19": "The Sultan of Johor Hol (estimated)", "2040-02-27": "Thaipusam", "2040-03-23": "Birthday of the Sultan of Johor", "2040-03-25": "Prophet Muhammad's Birthday (estimated)", + "2040-03-26": "Prophet Muhammad's Birthday (observed, estimated)", "2040-05-01": "Labor Day", "2040-05-25": "Vesak Day (estimated)", - "2040-05-27": "Vesak Day (observed, estimated)", "2040-06-04": "Birthday of HM Yang di-Pertuan Agong", "2040-08-31": "National Day", - "2040-09-02": "National Day (observed)", "2040-09-07": "Beginning of Ramadan (estimated)", - "2040-09-09": "Beginning of Ramadan (observed, estimated)", "2040-09-16": "Malaysia Day", + "2040-09-17": "Malaysia Day (observed)", "2040-10-07": "Eid al-Fitr (estimated)", "2040-10-08": "Eid al-Fitr (Second Day) (estimated)", + "2040-10-09": "Eid al-Fitr (observed, estimated)", "2040-11-03": "Deepavali", "2040-12-14": "Eid al-Adha (estimated)", - "2040-12-16": "Eid al-Adha (observed, estimated)", "2040-12-25": "Christmas Day", "2041-01-04": "Islamic New Year (estimated)", "2041-02-01": "Chinese New Year (estimated)", "2041-02-02": "Chinese New Year (Second Day) (estimated)", - "2041-02-03": "Chinese New Year (observed, estimated)", "2041-02-07": "The Sultan of Johor Hol (estimated)", "2041-02-15": "Thaipusam", - "2041-02-17": "Thaipusam (observed)", "2041-03-15": "Prophet Muhammad's Birthday (estimated)", - "2041-03-17": "Prophet Muhammad's Birthday (observed, estimated)", "2041-03-23": "Birthday of the Sultan of Johor", "2041-05-01": "Labor Day", "2041-05-14": "Vesak Day (estimated)", @@ -1528,7 +1536,6 @@ "2041-09-16": "Malaysia Day", "2041-09-26": "Eid al-Fitr (estimated)", "2041-09-27": "Eid al-Fitr (Second Day) (estimated)", - "2041-09-29": "Eid al-Fitr (Second Day) (observed, estimated)", "2041-10-23": "Deepavali", "2041-12-04": "Eid al-Adha (estimated)", "2041-12-24": "Islamic New Year (estimated)", @@ -1541,43 +1548,48 @@ "2042-03-23": "Birthday of the Sultan of Johor", "2042-05-01": "Labor Day", "2042-05-04": "Vesak Day (estimated)", + "2042-05-05": "Vesak Day (observed, estimated)", "2042-06-02": "Birthday of HM Yang di-Pertuan Agong", "2042-08-17": "Beginning of Ramadan (estimated)", + "2042-08-18": "Beginning of Ramadan (observed, estimated)", "2042-08-31": "National Day", + "2042-09-01": "National Day (observed)", "2042-09-15": "Eid al-Fitr (estimated)", "2042-09-16": "Eid al-Fitr (Second Day) (estimated); Malaysia Day", "2042-11-11": "Deepavali", "2042-11-23": "Eid al-Adha (estimated)", + "2042-11-24": "Eid al-Adha (observed, estimated)", "2042-12-14": "Islamic New Year (estimated)", "2042-12-25": "Christmas Day", "2043-01-17": "The Sultan of Johor Hol (estimated)", "2043-02-10": "Chinese New Year (estimated)", "2043-02-11": "Chinese New Year (Second Day) (estimated)", "2043-02-22": "Prophet Muhammad's Birthday (estimated)", + "2043-02-23": "Prophet Muhammad's Birthday (observed, estimated)", "2043-02-24": "Thaipusam", "2043-03-23": "Birthday of the Sultan of Johor", "2043-05-01": "Labor Day", - "2043-05-03": "Labor Day (observed)", "2043-05-23": "Vesak Day (estimated)", "2043-06-01": "Birthday of HM Yang di-Pertuan Agong", "2043-08-06": "Beginning of Ramadan (estimated)", "2043-08-31": "National Day", "2043-09-04": "Eid al-Fitr (estimated)", "2043-09-05": "Eid al-Fitr (Second Day) (estimated)", - "2043-09-06": "Eid al-Fitr (observed, estimated)", "2043-09-16": "Malaysia Day", "2043-10-31": "Deepavali", "2043-11-12": "Eid al-Adha (estimated)", "2043-12-03": "Islamic New Year (estimated)", "2043-12-25": "Christmas Day", - "2043-12-27": "Christmas Day (observed)", "2044-01-07": "The Sultan of Johor Hol (estimated)", "2044-01-30": "Chinese New Year (estimated)", "2044-01-31": "Chinese New Year (Second Day) (estimated)", + "2044-02-01": "Chinese New Year (Second Day) (observed, estimated)", "2044-02-11": "Prophet Muhammad's Birthday (estimated)", "2044-02-14": "Thaipusam", + "2044-02-15": "Thaipusam (observed)", "2044-03-23": "Birthday of the Sultan of Johor", "2044-05-01": "Labor Day", + "2044-05-02": "Labor Day (observed)", "2044-05-12": "Vesak Day (estimated)", "2044-06-06": "Birthday of HM Yang di-Pertuan Agong", "2044-07-26": "Beginning of Ramadan (estimated)", @@ -1585,16 +1597,15 @@ "2044-08-25": "Eid al-Fitr (Second Day) (estimated)", "2044-08-31": "National Day", "2044-09-16": "Malaysia Day", - "2044-09-18": "Malaysia Day (observed)", "2044-10-31": "Eid al-Adha (estimated)", "2044-11-17": "Deepavali", "2044-11-21": "Islamic New Year (estimated)", "2044-12-25": "Christmas Day", "2044-12-26": "The Sultan of Johor Hol (estimated)", + "2044-12-27": "Christmas Day (observed)", "2045-01-30": "Prophet Muhammad's Birthday (estimated)", "2045-02-17": "Chinese New Year (estimated)", "2045-02-18": "Chinese New Year (Second Day) (estimated)", - "2045-02-19": "Chinese New Year (observed, estimated)", "2045-03-04": "Thaipusam", "2045-03-23": "Birthday of the Sultan of Johor", "2045-05-01": "Labor Day; Vesak Day (estimated)", @@ -1610,21 +1621,20 @@ "2045-12-15": "The Sultan of Johor Hol (estimated)", "2045-12-25": "Christmas Day", "2046-01-19": "Prophet Muhammad's Birthday (estimated)", - "2046-01-21": "Prophet Muhammad's Birthday (observed, estimated)", "2046-02-06": "Chinese New Year (estimated)", "2046-02-07": "Chinese New Year (Second Day) (estimated)", "2046-02-21": "Thaipusam", "2046-03-23": "Birthday of the Sultan of Johor", "2046-05-01": "Labor Day", "2046-05-20": "Vesak Day (estimated)", + "2046-05-21": "Vesak Day (observed, estimated)", "2046-06-04": "Birthday of HM Yang di-Pertuan Agong", "2046-07-05": "Beginning of Ramadan (estimated)", "2046-08-03": "Eid al-Fitr (estimated)", "2046-08-04": "Eid al-Fitr (Second Day) (estimated)", - "2046-08-05": "Eid al-Fitr (observed, estimated)", "2046-08-31": "National Day", - "2046-09-02": "National Day (observed)", "2046-09-16": "Malaysia Day", + "2046-09-17": "Malaysia Day (observed)", "2046-10-10": "Eid al-Adha (estimated)", "2046-10-27": "Deepavali", "2046-10-31": "Islamic New Year (estimated)", @@ -1632,9 +1642,9 @@ "2046-12-25": "Christmas Day", "2047-01-08": "Prophet Muhammad's Birthday (estimated)", "2047-01-11": "Thaipusam", - "2047-01-13": "Thaipusam (observed)", "2047-01-26": "Chinese New Year (estimated)", "2047-01-27": "Chinese New Year (Second Day) (estimated)", + "2047-01-28": "Chinese New Year (Second Day) (observed, estimated)", "2047-03-23": "Birthday of the Sultan of Johor", "2047-05-01": "Labor Day", "2047-05-09": "Vesak Day (estimated)", @@ -1647,24 +1657,21 @@ "2047-09-30": "Eid al-Adha (estimated)", "2047-10-20": "Islamic New Year (estimated)", "2047-11-15": "Deepavali", - "2047-11-17": "Deepavali (observed)", "2047-11-24": "The Sultan of Johor Hol (estimated)", "2047-12-25": "Christmas Day", "2047-12-29": "Prophet Muhammad's Birthday (estimated)", + "2047-12-30": "Prophet Muhammad's Birthday (observed, estimated)", "2048-02-14": "Chinese New Year (estimated)", "2048-02-15": "Chinese New Year (Second Day) (estimated)", - "2048-02-16": "Chinese New Year (observed, estimated)", "2048-02-28": "Thaipusam", - "2048-03-01": "Thaipusam (observed)", "2048-03-23": "Birthday of the Sultan of Johor", "2048-05-01": "Labor Day", - "2048-05-03": "Labor Day (observed)", "2048-05-27": "Vesak Day (estimated)", "2048-06-01": "Birthday of HM Yang di-Pertuan Agong", "2048-06-12": "Beginning of Ramadan (estimated)", - "2048-06-14": "Beginning of Ramadan (observed, estimated)", "2048-07-12": "Eid al-Fitr (estimated)", "2048-07-13": "Eid al-Fitr (Second Day) (estimated)", + "2048-07-14": "Eid al-Fitr (observed, estimated)", "2048-08-31": "National Day", "2048-09-16": "Malaysia Day", "2048-09-19": "Eid al-Adha (estimated)", @@ -1672,20 +1679,18 @@ "2048-11-04": "Deepavali", "2048-11-12": "The Sultan of Johor Hol (estimated)", "2048-12-18": "Prophet Muhammad's Birthday (estimated)", - "2048-12-20": "Prophet Muhammad's Birthday (observed, estimated)", "2048-12-25": "Christmas Day", - "2048-12-27": "Christmas Day (observed)", "2049-02-02": "Chinese New Year (estimated)", "2049-02-03": "Chinese New Year (Second Day) (estimated)", "2049-02-17": "Thaipusam", "2049-03-23": "Birthday of the Sultan of Johor", "2049-05-01": "Labor Day", "2049-05-16": "Vesak Day (estimated)", + "2049-05-17": "Vesak Day (observed, estimated)", "2049-06-02": "Beginning of Ramadan (estimated)", "2049-06-07": "Birthday of HM Yang di-Pertuan Agong", "2049-07-01": "Eid al-Fitr (estimated)", "2049-07-02": "Eid al-Fitr (Second Day) (estimated)", - "2049-07-04": "Eid al-Fitr (Second Day) (observed, estimated)", "2049-08-31": "National Day", "2049-09-08": "Eid al-Adha (estimated)", "2049-09-16": "Malaysia Day", @@ -1697,20 +1702,24 @@ "2050-01-08": "Thaipusam", "2050-01-23": "Chinese New Year (estimated)", "2050-01-24": "Chinese New Year (Second Day) (estimated)", + "2050-01-25": "Chinese New Year (observed, estimated)", "2050-03-23": "Birthday of the Sultan of Johor", "2050-05-01": "Labor Day", + "2050-05-02": "Labor Day (observed)", "2050-05-05": "Vesak Day (estimated)", "2050-05-22": "Beginning of Ramadan (estimated)", + "2050-05-23": "Beginning of Ramadan (observed, estimated)", "2050-06-06": "Birthday of HM Yang di-Pertuan Agong", "2050-06-20": "Eid al-Fitr (estimated)", "2050-06-21": "Eid al-Fitr (Second Day) (estimated)", "2050-08-28": "Eid al-Adha (estimated)", + "2050-08-29": "Eid al-Adha (observed, estimated)", "2050-08-31": "National Day", "2050-09-16": "Malaysia Day", "2050-09-17": "Islamic New Year (estimated)", - "2050-09-18": "Malaysia Day (observed)", "2050-10-22": "The Sultan of Johor Hol (estimated)", "2050-11-12": "Deepavali", "2050-11-26": "Prophet Muhammad's Birthday (estimated)", - "2050-12-25": "Christmas Day" + "2050-12-25": "Christmas Day", + "2050-12-26": "Christmas Day (observed)" } From ad44b7c349c055bdc4a49a8cd71557475a9bd4f1 Mon Sep 17 00:00:00 2001 From: ~Jhellico Date: Mon, 14 Oct 2024 22:38:00 +0300 Subject: [PATCH 10/24] Update Vietnam holidays (#2049) --- holidays/countries/vietnam.py | 139 +++- holidays/groups/chinese.py | 10 - holidays/locale/en_US/LC_MESSAGES/VN.po | 56 +- holidays/locale/vi/LC_MESSAGES/VN.po | 46 +- snapshots/countries/VN_COMMON.json | 817 +++++++++++------------- tests/countries/test_vietnam.py | 83 ++- 6 files changed, 613 insertions(+), 538 deletions(-) diff --git a/holidays/countries/vietnam.py b/holidays/countries/vietnam.py index 231af59db..7ddd842ad 100644 --- a/holidays/countries/vietnam.py +++ b/holidays/countries/vietnam.py @@ -10,17 +10,49 @@ # Website: https://github.com/vacanza/holidays # License: MIT (see LICENSE file) +from datetime import date from gettext import gettext as tr -from holidays.groups import ChineseCalendarHolidays, InternationalHolidays -from holidays.observed_holiday_base import ObservedHolidayBase, SAT_SUN_TO_NEXT_WORKDAY - - -class Vietnam(ObservedHolidayBase, ChineseCalendarHolidays, InternationalHolidays): +from holidays.calendars.gregorian import ( + JAN, + FEB, + APR, + MAY, + SEP, + DEC, + MON, + TUE, + WED, + THU, + FRI, + SAT, + SUN, + _timedelta, +) +from holidays.groups import ChineseCalendarHolidays, InternationalHolidays, StaticHolidays +from holidays.observed_holiday_base import ( + ObservedHolidayBase, + ObservedRule, + SAT_TO_PREV_WORKDAY, + SUN_TO_NEXT_WORKDAY, + SAT_SUN_TO_NEXT_WORKDAY, +) + +NATIONAL_DAY_RULE = ObservedRule({MON: +1, TUE: -1, WED: -1, THU: +1, FRI: -1, SAT: -1, SUN: +1}) + + +class Vietnam(ObservedHolidayBase, ChineseCalendarHolidays, InternationalHolidays, StaticHolidays): """ - https://publicholidays.vn/ - http://vbpl.vn/TW/Pages/vbpqen-toanvan.aspx?ItemID=11013 Article.115 - https://www.timeanddate.com/holidays/vietnam/ + References: + - `Labor Code 1994 (Art. 73) (en) `_ + - `Labor Code 2012 (Art. 115) (en) `_ + - `Labor Code 2012 (Art. 115) (vi) `_ + - `Labor Code 2019 (Art. 112) (en) `_ + - `Labor Code 2019 (Art. 112) (vi) `_ + + Substituted holidays: + - `2018-2019 `_ + - `2024 `_ """ country = "VN" @@ -32,47 +64,81 @@ class Vietnam(ObservedHolidayBase, ChineseCalendarHolidays, InternationalHoliday def __init__(self, *args, **kwargs): ChineseCalendarHolidays.__init__(self) InternationalHolidays.__init__(self) + StaticHolidays.__init__(self, VietnamStaticHolidays) kwargs.setdefault("observed_rule", SAT_SUN_TO_NEXT_WORKDAY) + kwargs.setdefault("observed_since", 1995) super().__init__(*args, **kwargs) + def _add_lunar_new_year_observed(self, dt_lny: date) -> None: + if self._year <= 1994: + return None + + day_names = { + # 29 of Lunar New Year. + -2: tr("29 Tết"), + # Fourth Day of Lunar New Year. + 3: tr("Mùng bốn Tết Nguyên Đán"), + # Fifth Day of Lunar New Year. + 4: tr("Mùng năm Tết Nguyên Đán"), + # Sixth Day of Lunar New Year. + 5: tr("Mùng sáu Tết Nguyên Đán"), + } + for delta in range(-1, 4 if self._year >= 2013 else 3): + dt = _timedelta(dt_lny, delta) + dt_observed = self._get_observed_date( + dt, + rule=( + SAT_TO_PREV_WORKDAY + SUN_TO_NEXT_WORKDAY + if self._year >= 2014 + else SAT_SUN_TO_NEXT_WORKDAY + ), + ) + if dt_observed != dt: + self._add_holiday( + day_names[(dt_observed - dt_lny).days], # type: ignore[operator] + dt_observed, + ) + def _populate_public_holidays(self): dts_observed = set() - # New Year's Day + # New Year's Day. dts_observed.add(self._add_new_years_day(tr("Tết Dương lịch"))) - # Lunar New Year's Eve + # Lunar New Year's Eve. self._add_chinese_new_years_eve(tr("Giao thừa Tết Nguyên Đán")) - # Lunar New Year - self._add_chinese_new_years_day(tr("Tết Nguyên Đán")) + # Lunar New Year. + lny = self._add_chinese_new_years_day(tr("Tết Nguyên Đán")) - # Second Day of Lunar New Year + # Second Day of Lunar New Year. self._add_chinese_new_years_day_two(tr("Mùng hai Tết Nguyên Đán")) - # Third Day of Lunar New Year + # Third Day of Lunar New Year. self._add_chinese_new_years_day_three(tr("Mùng ba Tết Nguyên Đán")) - # Fourth Day of Lunar New Year - self._add_chinese_new_years_day_four(tr("Mùng bốn Tết Nguyên Đán")) - - # Fifth Day of Lunar New Year - self._add_chinese_new_years_day_five(tr("Mùng năm Tết Nguyên Đán")) + if self._year >= 2013: + # Fourth Day of Lunar New Year. + self._add_chinese_new_years_day_four(tr("Mùng bốn Tết Nguyên Đán")) if self._year >= 2007: - # Hung Kings' Commemoration Day + # Hung Kings' Commemoration Day. dts_observed.add(self._add_hung_kings_day(tr("Ngày Giỗ Tổ Hùng Vương"))) - # Liberation Day/Reunification Day + # Liberation Day/Reunification Day. dts_observed.add(self._add_holiday_apr_30(tr("Ngày Chiến thắng"))) - # International Labor Day + # International Labor Day. dts_observed.add(self._add_labor_day(tr("Ngày Quốc tế Lao động"))) - # National Day - dts_observed.add(self._add_holiday_sep_2(tr("Quốc khánh"))) + # National Day. + name = tr("Quốc khánh") + dts_observed.add(sep_2 := self._add_holiday_sep_2(name)) + if self._year >= 2021: + self._add_holiday(name, self._get_observed_date(sep_2, NATIONAL_DAY_RULE)) if self.observed: + self._add_lunar_new_year_observed(lny) self._populate_observed(dts_observed) @@ -82,3 +148,28 @@ class VN(Vietnam): class VNM(Vietnam): pass + + +class VietnamStaticHolidays: + # Date format (see strftime() Format Codes). + substituted_date_format = tr("%d/%m/%Y") + # Day off (substituted from %s). + substituted_label = tr("Ngày nghỉ (thay cho ngày %s)") + + special_public_holidays = { + 2010: (FEB, 19, FEB, 27), + 2012: (JAN, 27, FEB, 4), + 2013: (APR, 29, MAY, 4), + 2014: ( + (MAY, 2, APR, 26), + (SEP, 1, SEP, 6), + ), + 2015: ( + (JAN, 2, DEC, 27, 2014), + (FEB, 16, FEB, 14), + (APR, 29, APR, 25), + ), + 2018: (DEC, 31, JAN, 5, 2019), + 2019: (APR, 29, MAY, 4), + 2024: (APR, 29, MAY, 4), + } diff --git a/holidays/groups/chinese.py b/holidays/groups/chinese.py index 5563c7e64..e2f78af62 100644 --- a/holidays/groups/chinese.py +++ b/holidays/groups/chinese.py @@ -136,16 +136,6 @@ def _add_chinese_new_years_day_four(self, name) -> Optional[date]: name, self._chinese_calendar.lunar_new_year_date(self._year), days_delta=+3 ) - def _add_chinese_new_years_day_five(self, name) -> Optional[date]: - """ - Add Chinese New Year's Day Five. - - https://en.wikipedia.org/wiki/Chinese_New_Year - """ - return self._add_chinese_calendar_holiday( - name, self._chinese_calendar.lunar_new_year_date(self._year), days_delta=+4 - ) - def _add_qingming_festival(self, name) -> date: """ Add Qingming Festival (15th day after the Spring Equinox). diff --git a/holidays/locale/en_US/LC_MESSAGES/VN.po b/holidays/locale/en_US/LC_MESSAGES/VN.po index 0f416b642..408b6e257 100644 --- a/holidays/locale/en_US/LC_MESSAGES/VN.po +++ b/holidays/locale/en_US/LC_MESSAGES/VN.po @@ -14,62 +14,80 @@ # msgid "" msgstr "" -"Project-Id-Version: Holidays 0.58\n" +"Project-Id-Version: Holidays 0.59\n" "POT-Creation-Date: 2024-09-27 15:50+0700\n" -"PO-Revision-Date: 2024-09-27 15:50+0700\n" -"Last-Translator: Vu Nhat Chuong \n" +"PO-Revision-Date: 2024-10-09 20:57+0300\n" +"Last-Translator: ~Jhellico \n" "Language-Team: Holidays Localization Team\n" -"Language: vi\n" +"Language: en_US\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Lingva 5.0.4\n" +"X-Generator: Poedit 3.5\n" #. %s (observed). #, c-format msgid "%s (nghỉ bù)" msgstr "%s (observed)" -#. New Year's Day +#. New Year's Day. msgid "Tết Dương lịch" msgstr "New Year's Day" -#. Lunar New Year's Eve +#. 29 of Lunar New Year. +msgid "29 Tết" +msgstr "29 of Lunar New Year" + +#. Lunar New Year's Eve. msgid "Giao thừa Tết Nguyên Đán" msgstr "Lunar New Year's Eve" -#. Lunar New Year +#. Lunar New Year. msgid "Tết Nguyên Đán" msgstr "Lunar New Year" -#. Second Day of Lunar New Year +#. Second Day of Lunar New Year. msgid "Mùng hai Tết Nguyên Đán" -msgstr "The second day of Tet Holiday" +msgstr "Second Day of Lunar New Year" -#. Third Day of Lunar New Year +#. Third Day of Lunar New Year. msgid "Mùng ba Tết Nguyên Đán" -msgstr "The third day of Tet Holiday" +msgstr "Third Day of Lunar New Year" -#. Fourth Day of Lunar New Year +#. Fourth Day of Lunar New Year. msgid "Mùng bốn Tết Nguyên Đán" -msgstr "The fourth day of Tet Holiday" +msgstr "Fourth Day of Lunar New Year" -#. Fifth Day of Lunar New Year +#. Fifth Day of Lunar New Year. msgid "Mùng năm Tết Nguyên Đán" -msgstr "The fifth day of Tet Holiday" +msgstr "Fifth Day of Lunar New Year" + +#. Sixth Day of Lunar New Year. +msgid "Mùng sáu Tết Nguyên Đán" +msgstr "Sixth Day of Lunar New Year" -#. Hung Kings' Commemoration Day +#. Hung Kings' Commemoration Day. msgid "Ngày Giỗ Tổ Hùng Vương" msgstr "Hung Kings' Commemoration Day" -#. Liberation Day/Reunification Day +#. Liberation Day/Reunification Day. msgid "Ngày Chiến thắng" msgstr "Liberation Day/Reunification Day" -#. International Labor Day +#. International Labor Day. msgid "Ngày Quốc tế Lao động" msgstr "International Labor Day" -#. National Day +#. National Day. msgid "Quốc khánh" msgstr "National Day" + +#. Date format (see strftime() Format Codes). +msgid "%d/%m/%Y" +msgstr "%m/%d/%Y" + +#. Day off (substituted from %s). +#, c-format +msgid "Ngày nghỉ (thay cho ngày %s)" +msgstr "Day off (substituted from %s)" diff --git a/holidays/locale/vi/LC_MESSAGES/VN.po b/holidays/locale/vi/LC_MESSAGES/VN.po index 9ce748db1..f81a6e34b 100644 --- a/holidays/locale/vi/LC_MESSAGES/VN.po +++ b/holidays/locale/vi/LC_MESSAGES/VN.po @@ -14,62 +14,80 @@ # msgid "" msgstr "" -"Project-Id-Version: Holidays 0.58\n" +"Project-Id-Version: Holidays 0.59\n" "POT-Creation-Date: 2024-09-27 15:50+0700\n" -"PO-Revision-Date: 2024-09-27 15:50+0700\n" -"Last-Translator: Vu Nhat Chuong \n" +"PO-Revision-Date: 2024-10-09 20:58+0300\n" +"Last-Translator: ~Jhellico \n" "Language-Team: Holidays Localization Team\n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Lingva 5.0.4\n" +"X-Generator: Poedit 3.5\n" #. %s (observed). #, c-format msgid "%s (nghỉ bù)" msgstr "" -#. New Year's Day +#. New Year's Day. msgid "Tết Dương lịch" msgstr "" -#. Lunar New Year's Eve +#. 29 of Lunar New Year. +msgid "29 Tết" +msgstr "" + +#. Lunar New Year's Eve. msgid "Giao thừa Tết Nguyên Đán" msgstr "" -#. Lunar New Year +#. Lunar New Year. msgid "Tết Nguyên Đán" msgstr "" -#. Second Day of Lunar New Year +#. Second Day of Lunar New Year. msgid "Mùng hai Tết Nguyên Đán" msgstr "" -#. Third Day of Lunar New Year +#. Third Day of Lunar New Year. msgid "Mùng ba Tết Nguyên Đán" msgstr "" -#. Fourth Day of Lunar New Year +#. Fourth Day of Lunar New Year. msgid "Mùng bốn Tết Nguyên Đán" msgstr "" -#. Fifth Day of Lunar New Year +#. Fifth Day of Lunar New Year. msgid "Mùng năm Tết Nguyên Đán" msgstr "" -#. Hung Kings' Commemoration Day +#. Sixth Day of Lunar New Year. +msgid "Mùng sáu Tết Nguyên Đán" +msgstr "" + +#. Hung Kings' Commemoration Day. msgid "Ngày Giỗ Tổ Hùng Vương" msgstr "" -#. Liberation Day/Reunification Day +#. Liberation Day/Reunification Day. msgid "Ngày Chiến thắng" msgstr "" -#. International Labor Day +#. International Labor Day. msgid "Ngày Quốc tế Lao động" msgstr "" -#. National Day +#. National Day. msgid "Quốc khánh" msgstr "" + +#. Date format (see strftime() Format Codes). +msgid "%d/%m/%Y" +msgstr "" + +#. Day off (substituted from %s). +#, c-format +msgid "Ngày nghỉ (thay cho ngày %s)" +msgstr "" diff --git a/snapshots/countries/VN_COMMON.json b/snapshots/countries/VN_COMMON.json index bc9419105..873ad5af6 100644 --- a/snapshots/countries/VN_COMMON.json +++ b/snapshots/countries/VN_COMMON.json @@ -1,514 +1,370 @@ { "1950-01-01": "New Year's Day", - "1950-01-02": "New Year's Day (observed)", "1950-02-16": "Lunar New Year's Eve", "1950-02-17": "Lunar New Year", - "1950-02-18": "The second day of Tet Holiday", - "1950-02-19": "The third day of Tet Holiday", - "1950-02-20": "The fourth day of Tet Holiday", - "1950-02-21": "The fifth day of Tet Holiday", + "1950-02-18": "Second Day of Lunar New Year", + "1950-02-19": "Third Day of Lunar New Year", "1950-04-30": "Liberation Day/Reunification Day", "1950-05-01": "International Labor Day", - "1950-05-02": "Liberation Day/Reunification Day (observed)", "1950-09-02": "National Day", - "1950-09-04": "National Day (observed)", "1951-01-01": "New Year's Day", "1951-02-05": "Lunar New Year's Eve", "1951-02-06": "Lunar New Year", - "1951-02-07": "The second day of Tet Holiday", - "1951-02-08": "The third day of Tet Holiday", - "1951-02-09": "The fourth day of Tet Holiday", - "1951-02-10": "The fifth day of Tet Holiday", + "1951-02-07": "Second Day of Lunar New Year", + "1951-02-08": "Third Day of Lunar New Year", "1951-04-30": "Liberation Day/Reunification Day", "1951-05-01": "International Labor Day", "1951-09-02": "National Day", - "1951-09-03": "National Day (observed)", "1952-01-01": "New Year's Day", "1952-01-26": "Lunar New Year's Eve", "1952-01-27": "Lunar New Year", - "1952-01-28": "The second day of Tet Holiday", - "1952-01-29": "The third day of Tet Holiday", - "1952-01-30": "The fourth day of Tet Holiday", - "1952-01-31": "The fifth day of Tet Holiday", + "1952-01-28": "Second Day of Lunar New Year", + "1952-01-29": "Third Day of Lunar New Year", "1952-04-30": "Liberation Day/Reunification Day", "1952-05-01": "International Labor Day", "1952-09-02": "National Day", "1953-01-01": "New Year's Day", "1953-02-13": "Lunar New Year's Eve", "1953-02-14": "Lunar New Year", - "1953-02-15": "The second day of Tet Holiday", - "1953-02-16": "The third day of Tet Holiday", - "1953-02-17": "The fourth day of Tet Holiday", - "1953-02-18": "The fifth day of Tet Holiday", + "1953-02-15": "Second Day of Lunar New Year", + "1953-02-16": "Third Day of Lunar New Year", "1953-04-30": "Liberation Day/Reunification Day", "1953-05-01": "International Labor Day", "1953-09-02": "National Day", "1954-01-01": "New Year's Day", "1954-02-02": "Lunar New Year's Eve", "1954-02-03": "Lunar New Year", - "1954-02-04": "The second day of Tet Holiday", - "1954-02-05": "The third day of Tet Holiday", - "1954-02-06": "The fourth day of Tet Holiday", - "1954-02-07": "The fifth day of Tet Holiday", + "1954-02-04": "Second Day of Lunar New Year", + "1954-02-05": "Third Day of Lunar New Year", "1954-04-30": "Liberation Day/Reunification Day", "1954-05-01": "International Labor Day", - "1954-05-03": "International Labor Day (observed)", "1954-09-02": "National Day", "1955-01-01": "New Year's Day", - "1955-01-03": "New Year's Day (observed)", "1955-01-23": "Lunar New Year's Eve", "1955-01-24": "Lunar New Year", - "1955-01-25": "The second day of Tet Holiday", - "1955-01-26": "The third day of Tet Holiday", - "1955-01-27": "The fourth day of Tet Holiday", - "1955-01-28": "The fifth day of Tet Holiday", + "1955-01-25": "Second Day of Lunar New Year", + "1955-01-26": "Third Day of Lunar New Year", "1955-04-30": "Liberation Day/Reunification Day", "1955-05-01": "International Labor Day", - "1955-05-02": "Liberation Day/Reunification Day (observed)", - "1955-05-03": "International Labor Day (observed)", "1955-09-02": "National Day", "1956-01-01": "New Year's Day", - "1956-01-02": "New Year's Day (observed)", "1956-02-11": "Lunar New Year's Eve", "1956-02-12": "Lunar New Year", - "1956-02-13": "The second day of Tet Holiday", - "1956-02-14": "The third day of Tet Holiday", - "1956-02-15": "The fourth day of Tet Holiday", - "1956-02-16": "The fifth day of Tet Holiday", + "1956-02-13": "Second Day of Lunar New Year", + "1956-02-14": "Third Day of Lunar New Year", "1956-04-30": "Liberation Day/Reunification Day", "1956-05-01": "International Labor Day", "1956-09-02": "National Day", - "1956-09-03": "National Day (observed)", "1957-01-01": "New Year's Day", "1957-01-30": "Lunar New Year's Eve", "1957-01-31": "Lunar New Year", - "1957-02-01": "The second day of Tet Holiday", - "1957-02-02": "The third day of Tet Holiday", - "1957-02-03": "The fourth day of Tet Holiday", - "1957-02-04": "The fifth day of Tet Holiday", + "1957-02-01": "Second Day of Lunar New Year", + "1957-02-02": "Third Day of Lunar New Year", "1957-04-30": "Liberation Day/Reunification Day", "1957-05-01": "International Labor Day", "1957-09-02": "National Day", "1958-01-01": "New Year's Day", "1958-02-17": "Lunar New Year's Eve", "1958-02-18": "Lunar New Year", - "1958-02-19": "The second day of Tet Holiday", - "1958-02-20": "The third day of Tet Holiday", - "1958-02-21": "The fourth day of Tet Holiday", - "1958-02-22": "The fifth day of Tet Holiday", + "1958-02-19": "Second Day of Lunar New Year", + "1958-02-20": "Third Day of Lunar New Year", "1958-04-30": "Liberation Day/Reunification Day", "1958-05-01": "International Labor Day", "1958-09-02": "National Day", "1959-01-01": "New Year's Day", "1959-02-07": "Lunar New Year's Eve", "1959-02-08": "Lunar New Year", - "1959-02-09": "The second day of Tet Holiday", - "1959-02-10": "The third day of Tet Holiday", - "1959-02-11": "The fourth day of Tet Holiday", - "1959-02-12": "The fifth day of Tet Holiday", + "1959-02-09": "Second Day of Lunar New Year", + "1959-02-10": "Third Day of Lunar New Year", "1959-04-30": "Liberation Day/Reunification Day", "1959-05-01": "International Labor Day", "1959-09-02": "National Day", "1960-01-01": "New Year's Day", "1960-01-27": "Lunar New Year's Eve", "1960-01-28": "Lunar New Year", - "1960-01-29": "The second day of Tet Holiday", - "1960-01-30": "The third day of Tet Holiday", - "1960-01-31": "The fourth day of Tet Holiday", - "1960-02-01": "The fifth day of Tet Holiday", + "1960-01-29": "Second Day of Lunar New Year", + "1960-01-30": "Third Day of Lunar New Year", "1960-04-30": "Liberation Day/Reunification Day", "1960-05-01": "International Labor Day", - "1960-05-02": "Liberation Day/Reunification Day (observed)", - "1960-05-03": "International Labor Day (observed)", "1960-09-02": "National Day", "1961-01-01": "New Year's Day", - "1961-01-02": "New Year's Day (observed)", "1961-02-14": "Lunar New Year's Eve", "1961-02-15": "Lunar New Year", - "1961-02-16": "The second day of Tet Holiday", - "1961-02-17": "The third day of Tet Holiday", - "1961-02-18": "The fourth day of Tet Holiday", - "1961-02-19": "The fifth day of Tet Holiday", + "1961-02-16": "Second Day of Lunar New Year", + "1961-02-17": "Third Day of Lunar New Year", "1961-04-30": "Liberation Day/Reunification Day", "1961-05-01": "International Labor Day", - "1961-05-02": "Liberation Day/Reunification Day (observed)", "1961-09-02": "National Day", - "1961-09-04": "National Day (observed)", "1962-01-01": "New Year's Day", "1962-02-04": "Lunar New Year's Eve", "1962-02-05": "Lunar New Year", - "1962-02-06": "The second day of Tet Holiday", - "1962-02-07": "The third day of Tet Holiday", - "1962-02-08": "The fourth day of Tet Holiday", - "1962-02-09": "The fifth day of Tet Holiday", + "1962-02-06": "Second Day of Lunar New Year", + "1962-02-07": "Third Day of Lunar New Year", "1962-04-30": "Liberation Day/Reunification Day", "1962-05-01": "International Labor Day", "1962-09-02": "National Day", - "1962-09-03": "National Day (observed)", "1963-01-01": "New Year's Day", "1963-01-24": "Lunar New Year's Eve", "1963-01-25": "Lunar New Year", - "1963-01-26": "The second day of Tet Holiday", - "1963-01-27": "The third day of Tet Holiday", - "1963-01-28": "The fourth day of Tet Holiday", - "1963-01-29": "The fifth day of Tet Holiday", + "1963-01-26": "Second Day of Lunar New Year", + "1963-01-27": "Third Day of Lunar New Year", "1963-04-30": "Liberation Day/Reunification Day", "1963-05-01": "International Labor Day", "1963-09-02": "National Day", "1964-01-01": "New Year's Day", "1964-02-12": "Lunar New Year's Eve", "1964-02-13": "Lunar New Year", - "1964-02-14": "The second day of Tet Holiday", - "1964-02-15": "The third day of Tet Holiday", - "1964-02-16": "The fourth day of Tet Holiday", - "1964-02-17": "The fifth day of Tet Holiday", + "1964-02-14": "Second Day of Lunar New Year", + "1964-02-15": "Third Day of Lunar New Year", "1964-04-30": "Liberation Day/Reunification Day", "1964-05-01": "International Labor Day", "1964-09-02": "National Day", "1965-01-01": "New Year's Day", "1965-02-01": "Lunar New Year's Eve", "1965-02-02": "Lunar New Year", - "1965-02-03": "The second day of Tet Holiday", - "1965-02-04": "The third day of Tet Holiday", - "1965-02-05": "The fourth day of Tet Holiday", - "1965-02-06": "The fifth day of Tet Holiday", + "1965-02-03": "Second Day of Lunar New Year", + "1965-02-04": "Third Day of Lunar New Year", "1965-04-30": "Liberation Day/Reunification Day", "1965-05-01": "International Labor Day", - "1965-05-03": "International Labor Day (observed)", "1965-09-02": "National Day", "1966-01-01": "New Year's Day", - "1966-01-03": "New Year's Day (observed)", "1966-01-20": "Lunar New Year's Eve", "1966-01-21": "Lunar New Year", - "1966-01-22": "The second day of Tet Holiday", - "1966-01-23": "The third day of Tet Holiday", - "1966-01-24": "The fourth day of Tet Holiday", - "1966-01-25": "The fifth day of Tet Holiday", + "1966-01-22": "Second Day of Lunar New Year", + "1966-01-23": "Third Day of Lunar New Year", "1966-04-30": "Liberation Day/Reunification Day", "1966-05-01": "International Labor Day", - "1966-05-02": "Liberation Day/Reunification Day (observed)", - "1966-05-03": "International Labor Day (observed)", "1966-09-02": "National Day", "1967-01-01": "New Year's Day", - "1967-01-02": "New Year's Day (observed)", "1967-02-08": "Lunar New Year's Eve", "1967-02-09": "Lunar New Year", - "1967-02-10": "The second day of Tet Holiday", - "1967-02-11": "The third day of Tet Holiday", - "1967-02-12": "The fourth day of Tet Holiday", - "1967-02-13": "The fifth day of Tet Holiday", + "1967-02-10": "Second Day of Lunar New Year", + "1967-02-11": "Third Day of Lunar New Year", "1967-04-30": "Liberation Day/Reunification Day", "1967-05-01": "International Labor Day", - "1967-05-02": "Liberation Day/Reunification Day (observed)", "1967-09-02": "National Day", - "1967-09-04": "National Day (observed)", "1968-01-01": "New Year's Day", "1968-01-29": "Lunar New Year's Eve", "1968-01-30": "Lunar New Year", - "1968-01-31": "The second day of Tet Holiday", - "1968-02-01": "The third day of Tet Holiday", - "1968-02-02": "The fourth day of Tet Holiday", - "1968-02-03": "The fifth day of Tet Holiday", + "1968-01-31": "Second Day of Lunar New Year", + "1968-02-01": "Third Day of Lunar New Year", "1968-04-30": "Liberation Day/Reunification Day", "1968-05-01": "International Labor Day", "1968-09-02": "National Day", "1969-01-01": "New Year's Day", "1969-02-16": "Lunar New Year's Eve", "1969-02-17": "Lunar New Year", - "1969-02-18": "The second day of Tet Holiday", - "1969-02-19": "The third day of Tet Holiday", - "1969-02-20": "The fourth day of Tet Holiday", - "1969-02-21": "The fifth day of Tet Holiday", + "1969-02-18": "Second Day of Lunar New Year", + "1969-02-19": "Third Day of Lunar New Year", "1969-04-30": "Liberation Day/Reunification Day", "1969-05-01": "International Labor Day", "1969-09-02": "National Day", "1970-01-01": "New Year's Day", "1970-02-05": "Lunar New Year's Eve", "1970-02-06": "Lunar New Year", - "1970-02-07": "The second day of Tet Holiday", - "1970-02-08": "The third day of Tet Holiday", - "1970-02-09": "The fourth day of Tet Holiday", - "1970-02-10": "The fifth day of Tet Holiday", + "1970-02-07": "Second Day of Lunar New Year", + "1970-02-08": "Third Day of Lunar New Year", "1970-04-30": "Liberation Day/Reunification Day", "1970-05-01": "International Labor Day", "1970-09-02": "National Day", "1971-01-01": "New Year's Day", "1971-01-26": "Lunar New Year's Eve", "1971-01-27": "Lunar New Year", - "1971-01-28": "The second day of Tet Holiday", - "1971-01-29": "The third day of Tet Holiday", - "1971-01-30": "The fourth day of Tet Holiday", - "1971-01-31": "The fifth day of Tet Holiday", + "1971-01-28": "Second Day of Lunar New Year", + "1971-01-29": "Third Day of Lunar New Year", "1971-04-30": "Liberation Day/Reunification Day", "1971-05-01": "International Labor Day", - "1971-05-03": "International Labor Day (observed)", "1971-09-02": "National Day", "1972-01-01": "New Year's Day", - "1972-01-03": "New Year's Day (observed)", "1972-02-14": "Lunar New Year's Eve", "1972-02-15": "Lunar New Year", - "1972-02-16": "The second day of Tet Holiday", - "1972-02-17": "The third day of Tet Holiday", - "1972-02-18": "The fourth day of Tet Holiday", - "1972-02-19": "The fifth day of Tet Holiday", + "1972-02-16": "Second Day of Lunar New Year", + "1972-02-17": "Third Day of Lunar New Year", "1972-04-30": "Liberation Day/Reunification Day", "1972-05-01": "International Labor Day", - "1972-05-02": "Liberation Day/Reunification Day (observed)", "1972-09-02": "National Day", - "1972-09-04": "National Day (observed)", "1973-01-01": "New Year's Day", "1973-02-02": "Lunar New Year's Eve", "1973-02-03": "Lunar New Year", - "1973-02-04": "The second day of Tet Holiday", - "1973-02-05": "The third day of Tet Holiday", - "1973-02-06": "The fourth day of Tet Holiday", - "1973-02-07": "The fifth day of Tet Holiday", + "1973-02-04": "Second Day of Lunar New Year", + "1973-02-05": "Third Day of Lunar New Year", "1973-04-30": "Liberation Day/Reunification Day", "1973-05-01": "International Labor Day", "1973-09-02": "National Day", - "1973-09-03": "National Day (observed)", "1974-01-01": "New Year's Day", "1974-01-22": "Lunar New Year's Eve", "1974-01-23": "Lunar New Year", - "1974-01-24": "The second day of Tet Holiday", - "1974-01-25": "The third day of Tet Holiday", - "1974-01-26": "The fourth day of Tet Holiday", - "1974-01-27": "The fifth day of Tet Holiday", + "1974-01-24": "Second Day of Lunar New Year", + "1974-01-25": "Third Day of Lunar New Year", "1974-04-30": "Liberation Day/Reunification Day", "1974-05-01": "International Labor Day", "1974-09-02": "National Day", "1975-01-01": "New Year's Day", "1975-02-10": "Lunar New Year's Eve", "1975-02-11": "Lunar New Year", - "1975-02-12": "The second day of Tet Holiday", - "1975-02-13": "The third day of Tet Holiday", - "1975-02-14": "The fourth day of Tet Holiday", - "1975-02-15": "The fifth day of Tet Holiday", + "1975-02-12": "Second Day of Lunar New Year", + "1975-02-13": "Third Day of Lunar New Year", "1975-04-30": "Liberation Day/Reunification Day", "1975-05-01": "International Labor Day", "1975-09-02": "National Day", "1976-01-01": "New Year's Day", "1976-01-30": "Lunar New Year's Eve", "1976-01-31": "Lunar New Year", - "1976-02-01": "The second day of Tet Holiday", - "1976-02-02": "The third day of Tet Holiday", - "1976-02-03": "The fourth day of Tet Holiday", - "1976-02-04": "The fifth day of Tet Holiday", + "1976-02-01": "Second Day of Lunar New Year", + "1976-02-02": "Third Day of Lunar New Year", "1976-04-30": "Liberation Day/Reunification Day", "1976-05-01": "International Labor Day", - "1976-05-03": "International Labor Day (observed)", "1976-09-02": "National Day", "1977-01-01": "New Year's Day", - "1977-01-03": "New Year's Day (observed)", "1977-02-17": "Lunar New Year's Eve", "1977-02-18": "Lunar New Year", - "1977-02-19": "The second day of Tet Holiday", - "1977-02-20": "The third day of Tet Holiday", - "1977-02-21": "The fourth day of Tet Holiday", - "1977-02-22": "The fifth day of Tet Holiday", + "1977-02-19": "Second Day of Lunar New Year", + "1977-02-20": "Third Day of Lunar New Year", "1977-04-30": "Liberation Day/Reunification Day", "1977-05-01": "International Labor Day", - "1977-05-02": "Liberation Day/Reunification Day (observed)", - "1977-05-03": "International Labor Day (observed)", "1977-09-02": "National Day", "1978-01-01": "New Year's Day", - "1978-01-02": "New Year's Day (observed)", "1978-02-06": "Lunar New Year's Eve", "1978-02-07": "Lunar New Year", - "1978-02-08": "The second day of Tet Holiday", - "1978-02-09": "The third day of Tet Holiday", - "1978-02-10": "The fourth day of Tet Holiday", - "1978-02-11": "The fifth day of Tet Holiday", + "1978-02-08": "Second Day of Lunar New Year", + "1978-02-09": "Third Day of Lunar New Year", "1978-04-30": "Liberation Day/Reunification Day", "1978-05-01": "International Labor Day", - "1978-05-02": "Liberation Day/Reunification Day (observed)", "1978-09-02": "National Day", - "1978-09-04": "National Day (observed)", "1979-01-01": "New Year's Day", "1979-01-27": "Lunar New Year's Eve", "1979-01-28": "Lunar New Year", - "1979-01-29": "The second day of Tet Holiday", - "1979-01-30": "The third day of Tet Holiday", - "1979-01-31": "The fourth day of Tet Holiday", - "1979-02-01": "The fifth day of Tet Holiday", + "1979-01-29": "Second Day of Lunar New Year", + "1979-01-30": "Third Day of Lunar New Year", "1979-04-30": "Liberation Day/Reunification Day", "1979-05-01": "International Labor Day", "1979-09-02": "National Day", - "1979-09-03": "National Day (observed)", "1980-01-01": "New Year's Day", "1980-02-15": "Lunar New Year's Eve", "1980-02-16": "Lunar New Year", - "1980-02-17": "The second day of Tet Holiday", - "1980-02-18": "The third day of Tet Holiday", - "1980-02-19": "The fourth day of Tet Holiday", - "1980-02-20": "The fifth day of Tet Holiday", + "1980-02-17": "Second Day of Lunar New Year", + "1980-02-18": "Third Day of Lunar New Year", "1980-04-30": "Liberation Day/Reunification Day", "1980-05-01": "International Labor Day", "1980-09-02": "National Day", "1981-01-01": "New Year's Day", "1981-02-04": "Lunar New Year's Eve", "1981-02-05": "Lunar New Year", - "1981-02-06": "The second day of Tet Holiday", - "1981-02-07": "The third day of Tet Holiday", - "1981-02-08": "The fourth day of Tet Holiday", - "1981-02-09": "The fifth day of Tet Holiday", + "1981-02-06": "Second Day of Lunar New Year", + "1981-02-07": "Third Day of Lunar New Year", "1981-04-30": "Liberation Day/Reunification Day", "1981-05-01": "International Labor Day", "1981-09-02": "National Day", "1982-01-01": "New Year's Day", "1982-01-24": "Lunar New Year's Eve", "1982-01-25": "Lunar New Year", - "1982-01-26": "The second day of Tet Holiday", - "1982-01-27": "The third day of Tet Holiday", - "1982-01-28": "The fourth day of Tet Holiday", - "1982-01-29": "The fifth day of Tet Holiday", + "1982-01-26": "Second Day of Lunar New Year", + "1982-01-27": "Third Day of Lunar New Year", "1982-04-30": "Liberation Day/Reunification Day", "1982-05-01": "International Labor Day", - "1982-05-03": "International Labor Day (observed)", "1982-09-02": "National Day", "1983-01-01": "New Year's Day", - "1983-01-03": "New Year's Day (observed)", "1983-02-12": "Lunar New Year's Eve", "1983-02-13": "Lunar New Year", - "1983-02-14": "The second day of Tet Holiday", - "1983-02-15": "The third day of Tet Holiday", - "1983-02-16": "The fourth day of Tet Holiday", - "1983-02-17": "The fifth day of Tet Holiday", + "1983-02-14": "Second Day of Lunar New Year", + "1983-02-15": "Third Day of Lunar New Year", "1983-04-30": "Liberation Day/Reunification Day", "1983-05-01": "International Labor Day", - "1983-05-02": "Liberation Day/Reunification Day (observed)", - "1983-05-03": "International Labor Day (observed)", "1983-09-02": "National Day", "1984-01-01": "New Year's Day", - "1984-01-02": "New Year's Day (observed)", "1984-02-01": "Lunar New Year's Eve", "1984-02-02": "Lunar New Year", - "1984-02-03": "The second day of Tet Holiday", - "1984-02-04": "The third day of Tet Holiday", - "1984-02-05": "The fourth day of Tet Holiday", - "1984-02-06": "The fifth day of Tet Holiday", + "1984-02-03": "Second Day of Lunar New Year", + "1984-02-04": "Third Day of Lunar New Year", "1984-04-30": "Liberation Day/Reunification Day", "1984-05-01": "International Labor Day", "1984-09-02": "National Day", - "1984-09-03": "National Day (observed)", "1985-01-01": "New Year's Day", "1985-02-19": "Lunar New Year's Eve", "1985-02-20": "Lunar New Year", - "1985-02-21": "The second day of Tet Holiday", - "1985-02-22": "The third day of Tet Holiday", - "1985-02-23": "The fourth day of Tet Holiday", - "1985-02-24": "The fifth day of Tet Holiday", + "1985-02-21": "Second Day of Lunar New Year", + "1985-02-22": "Third Day of Lunar New Year", "1985-04-30": "Liberation Day/Reunification Day", "1985-05-01": "International Labor Day", "1985-09-02": "National Day", "1986-01-01": "New Year's Day", "1986-02-08": "Lunar New Year's Eve", "1986-02-09": "Lunar New Year", - "1986-02-10": "The second day of Tet Holiday", - "1986-02-11": "The third day of Tet Holiday", - "1986-02-12": "The fourth day of Tet Holiday", - "1986-02-13": "The fifth day of Tet Holiday", + "1986-02-10": "Second Day of Lunar New Year", + "1986-02-11": "Third Day of Lunar New Year", "1986-04-30": "Liberation Day/Reunification Day", "1986-05-01": "International Labor Day", "1986-09-02": "National Day", "1987-01-01": "New Year's Day", "1987-01-28": "Lunar New Year's Eve", "1987-01-29": "Lunar New Year", - "1987-01-30": "The second day of Tet Holiday", - "1987-01-31": "The third day of Tet Holiday", - "1987-02-01": "The fourth day of Tet Holiday", - "1987-02-02": "The fifth day of Tet Holiday", + "1987-01-30": "Second Day of Lunar New Year", + "1987-01-31": "Third Day of Lunar New Year", "1987-04-30": "Liberation Day/Reunification Day", "1987-05-01": "International Labor Day", "1987-09-02": "National Day", "1988-01-01": "New Year's Day", "1988-02-16": "Lunar New Year's Eve", "1988-02-17": "Lunar New Year", - "1988-02-18": "The second day of Tet Holiday", - "1988-02-19": "The third day of Tet Holiday", - "1988-02-20": "The fourth day of Tet Holiday", - "1988-02-21": "The fifth day of Tet Holiday", + "1988-02-18": "Second Day of Lunar New Year", + "1988-02-19": "Third Day of Lunar New Year", "1988-04-30": "Liberation Day/Reunification Day", "1988-05-01": "International Labor Day", - "1988-05-02": "Liberation Day/Reunification Day (observed)", - "1988-05-03": "International Labor Day (observed)", "1988-09-02": "National Day", "1989-01-01": "New Year's Day", - "1989-01-02": "New Year's Day (observed)", "1989-02-05": "Lunar New Year's Eve", "1989-02-06": "Lunar New Year", - "1989-02-07": "The second day of Tet Holiday", - "1989-02-08": "The third day of Tet Holiday", - "1989-02-09": "The fourth day of Tet Holiday", - "1989-02-10": "The fifth day of Tet Holiday", + "1989-02-07": "Second Day of Lunar New Year", + "1989-02-08": "Third Day of Lunar New Year", "1989-04-30": "Liberation Day/Reunification Day", "1989-05-01": "International Labor Day", - "1989-05-02": "Liberation Day/Reunification Day (observed)", "1989-09-02": "National Day", - "1989-09-04": "National Day (observed)", "1990-01-01": "New Year's Day", "1990-01-26": "Lunar New Year's Eve", "1990-01-27": "Lunar New Year", - "1990-01-28": "The second day of Tet Holiday", - "1990-01-29": "The third day of Tet Holiday", - "1990-01-30": "The fourth day of Tet Holiday", - "1990-01-31": "The fifth day of Tet Holiday", + "1990-01-28": "Second Day of Lunar New Year", + "1990-01-29": "Third Day of Lunar New Year", "1990-04-30": "Liberation Day/Reunification Day", "1990-05-01": "International Labor Day", "1990-09-02": "National Day", - "1990-09-03": "National Day (observed)", "1991-01-01": "New Year's Day", "1991-02-14": "Lunar New Year's Eve", "1991-02-15": "Lunar New Year", - "1991-02-16": "The second day of Tet Holiday", - "1991-02-17": "The third day of Tet Holiday", - "1991-02-18": "The fourth day of Tet Holiday", - "1991-02-19": "The fifth day of Tet Holiday", + "1991-02-16": "Second Day of Lunar New Year", + "1991-02-17": "Third Day of Lunar New Year", "1991-04-30": "Liberation Day/Reunification Day", "1991-05-01": "International Labor Day", "1991-09-02": "National Day", "1992-01-01": "New Year's Day", "1992-02-03": "Lunar New Year's Eve", "1992-02-04": "Lunar New Year", - "1992-02-05": "The second day of Tet Holiday", - "1992-02-06": "The third day of Tet Holiday", - "1992-02-07": "The fourth day of Tet Holiday", - "1992-02-08": "The fifth day of Tet Holiday", + "1992-02-05": "Second Day of Lunar New Year", + "1992-02-06": "Third Day of Lunar New Year", "1992-04-30": "Liberation Day/Reunification Day", "1992-05-01": "International Labor Day", "1992-09-02": "National Day", "1993-01-01": "New Year's Day", "1993-01-22": "Lunar New Year's Eve", "1993-01-23": "Lunar New Year", - "1993-01-24": "The second day of Tet Holiday", - "1993-01-25": "The third day of Tet Holiday", - "1993-01-26": "The fourth day of Tet Holiday", - "1993-01-27": "The fifth day of Tet Holiday", + "1993-01-24": "Second Day of Lunar New Year", + "1993-01-25": "Third Day of Lunar New Year", "1993-04-30": "Liberation Day/Reunification Day", "1993-05-01": "International Labor Day", - "1993-05-03": "International Labor Day (observed)", "1993-09-02": "National Day", "1994-01-01": "New Year's Day", - "1994-01-03": "New Year's Day (observed)", "1994-02-09": "Lunar New Year's Eve", "1994-02-10": "Lunar New Year", - "1994-02-11": "The second day of Tet Holiday", - "1994-02-12": "The third day of Tet Holiday", - "1994-02-13": "The fourth day of Tet Holiday", - "1994-02-14": "The fifth day of Tet Holiday", + "1994-02-11": "Second Day of Lunar New Year", + "1994-02-12": "Third Day of Lunar New Year", "1994-04-30": "Liberation Day/Reunification Day", "1994-05-01": "International Labor Day", - "1994-05-02": "Liberation Day/Reunification Day (observed)", - "1994-05-03": "International Labor Day (observed)", "1994-09-02": "National Day", "1995-01-01": "New Year's Day", "1995-01-02": "New Year's Day (observed)", "1995-01-30": "Lunar New Year's Eve", "1995-01-31": "Lunar New Year", - "1995-02-01": "The second day of Tet Holiday", - "1995-02-02": "The third day of Tet Holiday", - "1995-02-03": "The fourth day of Tet Holiday", - "1995-02-04": "The fifth day of Tet Holiday", + "1995-02-01": "Second Day of Lunar New Year", + "1995-02-02": "Third Day of Lunar New Year", "1995-04-30": "Liberation Day/Reunification Day", "1995-05-01": "International Labor Day", "1995-05-02": "Liberation Day/Reunification Day (observed)", @@ -517,40 +373,35 @@ "1996-01-01": "New Year's Day", "1996-02-18": "Lunar New Year's Eve", "1996-02-19": "Lunar New Year", - "1996-02-20": "The second day of Tet Holiday", - "1996-02-21": "The third day of Tet Holiday", - "1996-02-22": "The fourth day of Tet Holiday", - "1996-02-23": "The fifth day of Tet Holiday", + "1996-02-20": "Second Day of Lunar New Year", + "1996-02-21": "Third Day of Lunar New Year", + "1996-02-22": "Fourth Day of Lunar New Year", "1996-04-30": "Liberation Day/Reunification Day", "1996-05-01": "International Labor Day", "1996-09-02": "National Day", "1997-01-01": "New Year's Day", "1997-02-06": "Lunar New Year's Eve", "1997-02-07": "Lunar New Year", - "1997-02-08": "The second day of Tet Holiday", - "1997-02-09": "The third day of Tet Holiday", - "1997-02-10": "The fourth day of Tet Holiday", - "1997-02-11": "The fifth day of Tet Holiday", + "1997-02-08": "Second Day of Lunar New Year", + "1997-02-09": "Third Day of Lunar New Year", + "1997-02-10": "Fourth Day of Lunar New Year", + "1997-02-11": "Fifth Day of Lunar New Year", "1997-04-30": "Liberation Day/Reunification Day", "1997-05-01": "International Labor Day", "1997-09-02": "National Day", "1998-01-01": "New Year's Day", "1998-01-27": "Lunar New Year's Eve", "1998-01-28": "Lunar New Year", - "1998-01-29": "The second day of Tet Holiday", - "1998-01-30": "The third day of Tet Holiday", - "1998-01-31": "The fourth day of Tet Holiday", - "1998-02-01": "The fifth day of Tet Holiday", + "1998-01-29": "Second Day of Lunar New Year", + "1998-01-30": "Third Day of Lunar New Year", "1998-04-30": "Liberation Day/Reunification Day", "1998-05-01": "International Labor Day", "1998-09-02": "National Day", "1999-01-01": "New Year's Day", "1999-02-15": "Lunar New Year's Eve", "1999-02-16": "Lunar New Year", - "1999-02-17": "The second day of Tet Holiday", - "1999-02-18": "The third day of Tet Holiday", - "1999-02-19": "The fourth day of Tet Holiday", - "1999-02-20": "The fifth day of Tet Holiday", + "1999-02-17": "Second Day of Lunar New Year", + "1999-02-18": "Third Day of Lunar New Year", "1999-04-30": "Liberation Day/Reunification Day", "1999-05-01": "International Labor Day", "1999-05-03": "International Labor Day (observed)", @@ -559,10 +410,10 @@ "2000-01-03": "New Year's Day (observed)", "2000-02-04": "Lunar New Year's Eve", "2000-02-05": "Lunar New Year", - "2000-02-06": "The second day of Tet Holiday", - "2000-02-07": "The third day of Tet Holiday", - "2000-02-08": "The fourth day of Tet Holiday", - "2000-02-09": "The fifth day of Tet Holiday", + "2000-02-06": "Second Day of Lunar New Year", + "2000-02-07": "Third Day of Lunar New Year", + "2000-02-08": "Fourth Day of Lunar New Year", + "2000-02-09": "Fifth Day of Lunar New Year", "2000-04-30": "Liberation Day/Reunification Day", "2000-05-01": "International Labor Day", "2000-05-02": "Liberation Day/Reunification Day (observed)", @@ -571,10 +422,8 @@ "2001-01-01": "New Year's Day", "2001-01-23": "Lunar New Year's Eve", "2001-01-24": "Lunar New Year", - "2001-01-25": "The second day of Tet Holiday", - "2001-01-26": "The third day of Tet Holiday", - "2001-01-27": "The fourth day of Tet Holiday", - "2001-01-28": "The fifth day of Tet Holiday", + "2001-01-25": "Second Day of Lunar New Year", + "2001-01-26": "Third Day of Lunar New Year", "2001-04-30": "Liberation Day/Reunification Day", "2001-05-01": "International Labor Day", "2001-09-02": "National Day", @@ -582,30 +431,27 @@ "2002-01-01": "New Year's Day", "2002-02-11": "Lunar New Year's Eve", "2002-02-12": "Lunar New Year", - "2002-02-13": "The second day of Tet Holiday", - "2002-02-14": "The third day of Tet Holiday", - "2002-02-15": "The fourth day of Tet Holiday", - "2002-02-16": "The fifth day of Tet Holiday", + "2002-02-13": "Second Day of Lunar New Year", + "2002-02-14": "Third Day of Lunar New Year", "2002-04-30": "Liberation Day/Reunification Day", "2002-05-01": "International Labor Day", "2002-09-02": "National Day", "2003-01-01": "New Year's Day", "2003-01-31": "Lunar New Year's Eve", "2003-02-01": "Lunar New Year", - "2003-02-02": "The second day of Tet Holiday", - "2003-02-03": "The third day of Tet Holiday", - "2003-02-04": "The fourth day of Tet Holiday", - "2003-02-05": "The fifth day of Tet Holiday", + "2003-02-02": "Second Day of Lunar New Year", + "2003-02-03": "Third Day of Lunar New Year", + "2003-02-04": "Fourth Day of Lunar New Year", + "2003-02-05": "Fifth Day of Lunar New Year", "2003-04-30": "Liberation Day/Reunification Day", "2003-05-01": "International Labor Day", "2003-09-02": "National Day", "2004-01-01": "New Year's Day", "2004-01-21": "Lunar New Year's Eve", "2004-01-22": "Lunar New Year", - "2004-01-23": "The second day of Tet Holiday", - "2004-01-24": "The third day of Tet Holiday", - "2004-01-25": "The fourth day of Tet Holiday", - "2004-01-26": "The fifth day of Tet Holiday", + "2004-01-23": "Second Day of Lunar New Year", + "2004-01-24": "Third Day of Lunar New Year", + "2004-01-26": "Fifth Day of Lunar New Year", "2004-04-30": "Liberation Day/Reunification Day", "2004-05-01": "International Labor Day", "2004-05-03": "International Labor Day (observed)", @@ -614,10 +460,8 @@ "2005-01-03": "New Year's Day (observed)", "2005-02-08": "Lunar New Year's Eve", "2005-02-09": "Lunar New Year", - "2005-02-10": "The second day of Tet Holiday", - "2005-02-11": "The third day of Tet Holiday", - "2005-02-12": "The fourth day of Tet Holiday", - "2005-02-13": "The fifth day of Tet Holiday", + "2005-02-10": "Second Day of Lunar New Year", + "2005-02-11": "Third Day of Lunar New Year", "2005-04-30": "Liberation Day/Reunification Day", "2005-05-01": "International Labor Day", "2005-05-02": "Liberation Day/Reunification Day (observed)", @@ -627,10 +471,10 @@ "2006-01-02": "New Year's Day (observed)", "2006-01-28": "Lunar New Year's Eve", "2006-01-29": "Lunar New Year", - "2006-01-30": "The second day of Tet Holiday", - "2006-01-31": "The third day of Tet Holiday", - "2006-02-01": "The fourth day of Tet Holiday", - "2006-02-02": "The fifth day of Tet Holiday", + "2006-01-30": "Second Day of Lunar New Year", + "2006-01-31": "Third Day of Lunar New Year", + "2006-02-01": "Fourth Day of Lunar New Year", + "2006-02-02": "Fifth Day of Lunar New Year", "2006-04-30": "Liberation Day/Reunification Day", "2006-05-01": "International Labor Day", "2006-05-02": "Liberation Day/Reunification Day (observed)", @@ -639,10 +483,10 @@ "2007-01-01": "New Year's Day", "2007-02-17": "Lunar New Year's Eve", "2007-02-18": "Lunar New Year", - "2007-02-19": "The second day of Tet Holiday", - "2007-02-20": "The third day of Tet Holiday", - "2007-02-21": "The fourth day of Tet Holiday", - "2007-02-22": "The fifth day of Tet Holiday", + "2007-02-19": "Second Day of Lunar New Year", + "2007-02-20": "Third Day of Lunar New Year", + "2007-02-21": "Fourth Day of Lunar New Year", + "2007-02-22": "Fifth Day of Lunar New Year", "2007-04-26": "Hung Kings' Commemoration Day", "2007-04-30": "Liberation Day/Reunification Day", "2007-05-01": "International Labor Day", @@ -651,10 +495,9 @@ "2008-01-01": "New Year's Day", "2008-02-06": "Lunar New Year's Eve", "2008-02-07": "Lunar New Year", - "2008-02-08": "The second day of Tet Holiday", - "2008-02-09": "The third day of Tet Holiday", - "2008-02-10": "The fourth day of Tet Holiday", - "2008-02-11": "The fifth day of Tet Holiday", + "2008-02-08": "Second Day of Lunar New Year", + "2008-02-09": "Third Day of Lunar New Year", + "2008-02-11": "Fifth Day of Lunar New Year", "2008-04-15": "Hung Kings' Commemoration Day", "2008-04-30": "Liberation Day/Reunification Day", "2008-05-01": "International Labor Day", @@ -662,10 +505,9 @@ "2009-01-01": "New Year's Day", "2009-01-25": "Lunar New Year's Eve", "2009-01-26": "Lunar New Year", - "2009-01-27": "The second day of Tet Holiday", - "2009-01-28": "The third day of Tet Holiday", - "2009-01-29": "The fourth day of Tet Holiday", - "2009-01-30": "The fifth day of Tet Holiday", + "2009-01-27": "Second Day of Lunar New Year", + "2009-01-28": "Third Day of Lunar New Year", + "2009-01-29": "Fourth Day of Lunar New Year", "2009-04-05": "Hung Kings' Commemoration Day", "2009-04-06": "Hung Kings' Commemoration Day (observed)", "2009-04-30": "Liberation Day/Reunification Day", @@ -674,10 +516,11 @@ "2010-01-01": "New Year's Day", "2010-02-13": "Lunar New Year's Eve", "2010-02-14": "Lunar New Year", - "2010-02-15": "The second day of Tet Holiday", - "2010-02-16": "The third day of Tet Holiday", - "2010-02-17": "The fourth day of Tet Holiday", - "2010-02-18": "The fifth day of Tet Holiday", + "2010-02-15": "Second Day of Lunar New Year", + "2010-02-16": "Third Day of Lunar New Year", + "2010-02-17": "Fourth Day of Lunar New Year", + "2010-02-18": "Fifth Day of Lunar New Year", + "2010-02-19": "Day off (substituted from 02/27/2010)", "2010-04-23": "Hung Kings' Commemoration Day", "2010-04-30": "Liberation Day/Reunification Day", "2010-05-01": "International Labor Day", @@ -687,10 +530,9 @@ "2011-01-03": "New Year's Day (observed)", "2011-02-02": "Lunar New Year's Eve", "2011-02-03": "Lunar New Year", - "2011-02-04": "The second day of Tet Holiday", - "2011-02-05": "The third day of Tet Holiday", - "2011-02-06": "The fourth day of Tet Holiday", - "2011-02-07": "The fifth day of Tet Holiday", + "2011-02-04": "Second Day of Lunar New Year", + "2011-02-05": "Third Day of Lunar New Year", + "2011-02-07": "Fifth Day of Lunar New Year", "2011-04-12": "Hung Kings' Commemoration Day", "2011-04-30": "Liberation Day/Reunification Day", "2011-05-01": "International Labor Day", @@ -701,10 +543,10 @@ "2012-01-02": "New Year's Day (observed)", "2012-01-22": "Lunar New Year's Eve", "2012-01-23": "Lunar New Year", - "2012-01-24": "The second day of Tet Holiday", - "2012-01-25": "The third day of Tet Holiday", - "2012-01-26": "The fourth day of Tet Holiday", - "2012-01-27": "The fifth day of Tet Holiday", + "2012-01-24": "Second Day of Lunar New Year", + "2012-01-25": "Third Day of Lunar New Year", + "2012-01-26": "Fourth Day of Lunar New Year", + "2012-01-27": "Day off (substituted from 02/04/2012)", "2012-03-31": "Hung Kings' Commemoration Day", "2012-04-02": "Hung Kings' Commemoration Day (observed)", "2012-04-30": "Liberation Day/Reunification Day", @@ -714,43 +556,52 @@ "2013-01-01": "New Year's Day", "2013-02-09": "Lunar New Year's Eve", "2013-02-10": "Lunar New Year", - "2013-02-11": "The second day of Tet Holiday", - "2013-02-12": "The third day of Tet Holiday", - "2013-02-13": "The fourth day of Tet Holiday", - "2013-02-14": "The fifth day of Tet Holiday", + "2013-02-11": "Second Day of Lunar New Year", + "2013-02-12": "Third Day of Lunar New Year", + "2013-02-13": "Fourth Day of Lunar New Year", + "2013-02-14": "Fifth Day of Lunar New Year", + "2013-02-15": "Sixth Day of Lunar New Year", "2013-04-19": "Hung Kings' Commemoration Day", + "2013-04-29": "Day off (substituted from 05/04/2013)", "2013-04-30": "Liberation Day/Reunification Day", "2013-05-01": "International Labor Day", "2013-09-02": "National Day", "2014-01-01": "New Year's Day", + "2014-01-29": "29 of Lunar New Year", "2014-01-30": "Lunar New Year's Eve", "2014-01-31": "Lunar New Year", - "2014-02-01": "The second day of Tet Holiday", - "2014-02-02": "The third day of Tet Holiday", - "2014-02-03": "The fourth day of Tet Holiday", - "2014-02-04": "The fifth day of Tet Holiday", + "2014-02-01": "Second Day of Lunar New Year", + "2014-02-02": "Third Day of Lunar New Year", + "2014-02-03": "Fourth Day of Lunar New Year", + "2014-02-04": "Fifth Day of Lunar New Year", "2014-04-09": "Hung Kings' Commemoration Day", "2014-04-30": "Liberation Day/Reunification Day", "2014-05-01": "International Labor Day", + "2014-05-02": "Day off (substituted from 04/26/2014)", + "2014-09-01": "Day off (substituted from 09/06/2014)", "2014-09-02": "National Day", "2015-01-01": "New Year's Day", + "2015-01-02": "Day off (substituted from 12/27/2014)", + "2015-02-16": "Day off (substituted from 02/14/2015)", + "2015-02-17": "29 of Lunar New Year", "2015-02-18": "Lunar New Year's Eve", "2015-02-19": "Lunar New Year", - "2015-02-20": "The second day of Tet Holiday", - "2015-02-21": "The third day of Tet Holiday", - "2015-02-22": "The fourth day of Tet Holiday", - "2015-02-23": "The fifth day of Tet Holiday", + "2015-02-20": "Second Day of Lunar New Year", + "2015-02-21": "Third Day of Lunar New Year", + "2015-02-22": "Fourth Day of Lunar New Year", + "2015-02-23": "Fifth Day of Lunar New Year", "2015-04-28": "Hung Kings' Commemoration Day", + "2015-04-29": "Day off (substituted from 04/25/2015)", "2015-04-30": "Liberation Day/Reunification Day", "2015-05-01": "International Labor Day", "2015-09-02": "National Day", "2016-01-01": "New Year's Day", "2016-02-07": "Lunar New Year's Eve", "2016-02-08": "Lunar New Year", - "2016-02-09": "The second day of Tet Holiday", - "2016-02-10": "The third day of Tet Holiday", - "2016-02-11": "The fourth day of Tet Holiday", - "2016-02-12": "The fifth day of Tet Holiday", + "2016-02-09": "Second Day of Lunar New Year", + "2016-02-10": "Third Day of Lunar New Year", + "2016-02-11": "Fourth Day of Lunar New Year", + "2016-02-12": "Fifth Day of Lunar New Year", "2016-04-16": "Hung Kings' Commemoration Day", "2016-04-18": "Hung Kings' Commemoration Day (observed)", "2016-04-30": "Liberation Day/Reunification Day", @@ -760,12 +611,13 @@ "2016-09-02": "National Day", "2017-01-01": "New Year's Day", "2017-01-02": "New Year's Day (observed)", + "2017-01-26": "29 of Lunar New Year", "2017-01-27": "Lunar New Year's Eve", "2017-01-28": "Lunar New Year", - "2017-01-29": "The second day of Tet Holiday", - "2017-01-30": "The third day of Tet Holiday", - "2017-01-31": "The fourth day of Tet Holiday", - "2017-02-01": "The fifth day of Tet Holiday", + "2017-01-29": "Second Day of Lunar New Year", + "2017-01-30": "Third Day of Lunar New Year", + "2017-01-31": "Fourth Day of Lunar New Year", + "2017-02-01": "Fifth Day of Lunar New Year", "2017-04-06": "Hung Kings' Commemoration Day", "2017-04-30": "Liberation Day/Reunification Day", "2017-05-01": "International Labor Day", @@ -773,414 +625,459 @@ "2017-09-02": "National Day", "2017-09-04": "National Day (observed)", "2018-01-01": "New Year's Day", + "2018-02-14": "29 of Lunar New Year", "2018-02-15": "Lunar New Year's Eve", "2018-02-16": "Lunar New Year", - "2018-02-17": "The second day of Tet Holiday", - "2018-02-18": "The third day of Tet Holiday", - "2018-02-19": "The fourth day of Tet Holiday", - "2018-02-20": "The fifth day of Tet Holiday", + "2018-02-17": "Second Day of Lunar New Year", + "2018-02-18": "Third Day of Lunar New Year", + "2018-02-19": "Fourth Day of Lunar New Year", + "2018-02-20": "Fifth Day of Lunar New Year", "2018-04-25": "Hung Kings' Commemoration Day", "2018-04-30": "Liberation Day/Reunification Day", "2018-05-01": "International Labor Day", "2018-09-02": "National Day", "2018-09-03": "National Day (observed)", + "2018-12-31": "Day off (substituted from 01/05/2019)", "2019-01-01": "New Year's Day", "2019-02-04": "Lunar New Year's Eve", "2019-02-05": "Lunar New Year", - "2019-02-06": "The second day of Tet Holiday", - "2019-02-07": "The third day of Tet Holiday", - "2019-02-08": "The fourth day of Tet Holiday", - "2019-02-09": "The fifth day of Tet Holiday", + "2019-02-06": "Second Day of Lunar New Year", + "2019-02-07": "Third Day of Lunar New Year", + "2019-02-08": "Fourth Day of Lunar New Year", "2019-04-14": "Hung Kings' Commemoration Day", "2019-04-15": "Hung Kings' Commemoration Day (observed)", + "2019-04-29": "Day off (substituted from 05/04/2019)", "2019-04-30": "Liberation Day/Reunification Day", "2019-05-01": "International Labor Day", "2019-09-02": "National Day", "2020-01-01": "New Year's Day", + "2020-01-23": "29 of Lunar New Year", "2020-01-24": "Lunar New Year's Eve", "2020-01-25": "Lunar New Year", - "2020-01-26": "The second day of Tet Holiday", - "2020-01-27": "The third day of Tet Holiday", - "2020-01-28": "The fourth day of Tet Holiday", - "2020-01-29": "The fifth day of Tet Holiday", + "2020-01-26": "Second Day of Lunar New Year", + "2020-01-27": "Third Day of Lunar New Year", + "2020-01-28": "Fourth Day of Lunar New Year", + "2020-01-29": "Fifth Day of Lunar New Year", "2020-04-02": "Hung Kings' Commemoration Day", "2020-04-30": "Liberation Day/Reunification Day", "2020-05-01": "International Labor Day", "2020-09-02": "National Day", "2021-01-01": "New Year's Day", + "2021-02-10": "29 of Lunar New Year", "2021-02-11": "Lunar New Year's Eve", "2021-02-12": "Lunar New Year", - "2021-02-13": "The second day of Tet Holiday", - "2021-02-14": "The third day of Tet Holiday", - "2021-02-15": "The fourth day of Tet Holiday", - "2021-02-16": "The fifth day of Tet Holiday", + "2021-02-13": "Second Day of Lunar New Year", + "2021-02-14": "Third Day of Lunar New Year", + "2021-02-15": "Fourth Day of Lunar New Year", + "2021-02-16": "Fifth Day of Lunar New Year", "2021-04-21": "Hung Kings' Commemoration Day", "2021-04-30": "Liberation Day/Reunification Day", "2021-05-01": "International Labor Day", "2021-05-03": "International Labor Day (observed)", "2021-09-02": "National Day", + "2021-09-03": "National Day", "2022-01-01": "New Year's Day", "2022-01-03": "New Year's Day (observed)", "2022-01-31": "Lunar New Year's Eve", "2022-02-01": "Lunar New Year", - "2022-02-02": "The second day of Tet Holiday", - "2022-02-03": "The third day of Tet Holiday", - "2022-02-04": "The fourth day of Tet Holiday", - "2022-02-05": "The fifth day of Tet Holiday", + "2022-02-02": "Second Day of Lunar New Year", + "2022-02-03": "Third Day of Lunar New Year", + "2022-02-04": "Fourth Day of Lunar New Year", "2022-04-10": "Hung Kings' Commemoration Day", "2022-04-11": "Hung Kings' Commemoration Day (observed)", "2022-04-30": "Liberation Day/Reunification Day", "2022-05-01": "International Labor Day", "2022-05-02": "Liberation Day/Reunification Day (observed)", "2022-05-03": "International Labor Day (observed)", + "2022-09-01": "National Day", "2022-09-02": "National Day", "2023-01-01": "New Year's Day", "2023-01-02": "New Year's Day (observed)", + "2023-01-20": "29 of Lunar New Year", "2023-01-21": "Lunar New Year's Eve", "2023-01-22": "Lunar New Year", - "2023-01-23": "The second day of Tet Holiday", - "2023-01-24": "The third day of Tet Holiday", - "2023-01-25": "The fourth day of Tet Holiday", - "2023-01-26": "The fifth day of Tet Holiday", + "2023-01-23": "Second Day of Lunar New Year", + "2023-01-24": "Third Day of Lunar New Year", + "2023-01-25": "Fourth Day of Lunar New Year", + "2023-01-26": "Fifth Day of Lunar New Year", "2023-04-29": "Hung Kings' Commemoration Day", "2023-04-30": "Liberation Day/Reunification Day", "2023-05-01": "International Labor Day", "2023-05-02": "Hung Kings' Commemoration Day (observed)", "2023-05-03": "Liberation Day/Reunification Day (observed)", + "2023-09-01": "National Day", "2023-09-02": "National Day", "2023-09-04": "National Day (observed)", "2024-01-01": "New Year's Day", + "2024-02-08": "29 of Lunar New Year", "2024-02-09": "Lunar New Year's Eve", "2024-02-10": "Lunar New Year", - "2024-02-11": "The second day of Tet Holiday", - "2024-02-12": "The third day of Tet Holiday", - "2024-02-13": "The fourth day of Tet Holiday", - "2024-02-14": "The fifth day of Tet Holiday", + "2024-02-11": "Second Day of Lunar New Year", + "2024-02-12": "Third Day of Lunar New Year", + "2024-02-13": "Fourth Day of Lunar New Year", + "2024-02-14": "Fifth Day of Lunar New Year", "2024-04-18": "Hung Kings' Commemoration Day", + "2024-04-29": "Day off (substituted from 05/04/2024)", "2024-04-30": "Liberation Day/Reunification Day", "2024-05-01": "International Labor Day", "2024-09-02": "National Day", + "2024-09-03": "National Day", "2025-01-01": "New Year's Day", + "2025-01-27": "29 of Lunar New Year", "2025-01-28": "Lunar New Year's Eve", "2025-01-29": "Lunar New Year", - "2025-01-30": "The second day of Tet Holiday", - "2025-01-31": "The third day of Tet Holiday", - "2025-02-01": "The fourth day of Tet Holiday", - "2025-02-02": "The fifth day of Tet Holiday", + "2025-01-30": "Second Day of Lunar New Year", + "2025-01-31": "Third Day of Lunar New Year", + "2025-02-01": "Fourth Day of Lunar New Year", "2025-04-07": "Hung Kings' Commemoration Day", "2025-04-30": "Liberation Day/Reunification Day", "2025-05-01": "International Labor Day", + "2025-09-01": "National Day", "2025-09-02": "National Day", "2026-01-01": "New Year's Day", "2026-02-16": "Lunar New Year's Eve", "2026-02-17": "Lunar New Year", - "2026-02-18": "The second day of Tet Holiday", - "2026-02-19": "The third day of Tet Holiday", - "2026-02-20": "The fourth day of Tet Holiday", - "2026-02-21": "The fifth day of Tet Holiday", + "2026-02-18": "Second Day of Lunar New Year", + "2026-02-19": "Third Day of Lunar New Year", + "2026-02-20": "Fourth Day of Lunar New Year", "2026-04-26": "Hung Kings' Commemoration Day", "2026-04-27": "Hung Kings' Commemoration Day (observed)", "2026-04-30": "Liberation Day/Reunification Day", "2026-05-01": "International Labor Day", + "2026-09-01": "National Day", "2026-09-02": "National Day", "2027-01-01": "New Year's Day", + "2027-02-04": "29 of Lunar New Year", "2027-02-05": "Lunar New Year's Eve", "2027-02-06": "Lunar New Year", - "2027-02-07": "The second day of Tet Holiday", - "2027-02-08": "The third day of Tet Holiday", - "2027-02-09": "The fourth day of Tet Holiday", - "2027-02-10": "The fifth day of Tet Holiday", + "2027-02-07": "Second Day of Lunar New Year", + "2027-02-08": "Third Day of Lunar New Year", + "2027-02-09": "Fourth Day of Lunar New Year", + "2027-02-10": "Fifth Day of Lunar New Year", "2027-04-16": "Hung Kings' Commemoration Day", "2027-04-30": "Liberation Day/Reunification Day", "2027-05-01": "International Labor Day", "2027-05-03": "International Labor Day (observed)", "2027-09-02": "National Day", + "2027-09-03": "National Day", "2028-01-01": "New Year's Day", "2028-01-03": "New Year's Day (observed)", + "2028-01-24": "29 of Lunar New Year", "2028-01-25": "Lunar New Year's Eve", "2028-01-26": "Lunar New Year", - "2028-01-27": "The second day of Tet Holiday", - "2028-01-28": "The third day of Tet Holiday", - "2028-01-29": "The fourth day of Tet Holiday", - "2028-01-30": "The fifth day of Tet Holiday", + "2028-01-27": "Second Day of Lunar New Year", + "2028-01-28": "Third Day of Lunar New Year", + "2028-01-29": "Fourth Day of Lunar New Year", "2028-04-04": "Hung Kings' Commemoration Day", "2028-04-30": "Liberation Day/Reunification Day", "2028-05-01": "International Labor Day", "2028-05-02": "Liberation Day/Reunification Day (observed)", + "2028-09-01": "National Day", "2028-09-02": "National Day", "2028-09-04": "National Day (observed)", "2029-01-01": "New Year's Day", "2029-02-12": "Lunar New Year's Eve", "2029-02-13": "Lunar New Year", - "2029-02-14": "The second day of Tet Holiday", - "2029-02-15": "The third day of Tet Holiday", - "2029-02-16": "The fourth day of Tet Holiday", - "2029-02-17": "The fifth day of Tet Holiday", + "2029-02-14": "Second Day of Lunar New Year", + "2029-02-15": "Third Day of Lunar New Year", + "2029-02-16": "Fourth Day of Lunar New Year", "2029-04-23": "Hung Kings' Commemoration Day", "2029-04-30": "Liberation Day/Reunification Day", "2029-05-01": "International Labor Day", "2029-09-02": "National Day", - "2029-09-03": "National Day (observed)", + "2029-09-03": "National Day", + "2029-09-04": "National Day (observed)", "2030-01-01": "New Year's Day", + "2030-02-01": "29 of Lunar New Year", "2030-02-02": "Lunar New Year's Eve", "2030-02-03": "Lunar New Year", - "2030-02-04": "The second day of Tet Holiday", - "2030-02-05": "The third day of Tet Holiday", - "2030-02-06": "The fourth day of Tet Holiday", - "2030-02-07": "The fifth day of Tet Holiday", + "2030-02-04": "Second Day of Lunar New Year", + "2030-02-05": "Third Day of Lunar New Year", + "2030-02-06": "Fourth Day of Lunar New Year", + "2030-02-07": "Fifth Day of Lunar New Year", "2030-04-12": "Hung Kings' Commemoration Day", "2030-04-30": "Liberation Day/Reunification Day", "2030-05-01": "International Labor Day", "2030-09-02": "National Day", + "2030-09-03": "National Day", "2031-01-01": "New Year's Day", + "2031-01-21": "29 of Lunar New Year", "2031-01-22": "Lunar New Year's Eve", "2031-01-23": "Lunar New Year", - "2031-01-24": "The second day of Tet Holiday", - "2031-01-25": "The third day of Tet Holiday", - "2031-01-26": "The fourth day of Tet Holiday", - "2031-01-27": "The fifth day of Tet Holiday", + "2031-01-24": "Second Day of Lunar New Year", + "2031-01-25": "Third Day of Lunar New Year", + "2031-01-26": "Fourth Day of Lunar New Year", + "2031-01-27": "Fifth Day of Lunar New Year", "2031-04-01": "Hung Kings' Commemoration Day", "2031-04-30": "Liberation Day/Reunification Day", "2031-05-01": "International Labor Day", + "2031-09-01": "National Day", "2031-09-02": "National Day", "2032-01-01": "New Year's Day", + "2032-02-09": "29 of Lunar New Year", "2032-02-10": "Lunar New Year's Eve", "2032-02-11": "Lunar New Year", - "2032-02-12": "The second day of Tet Holiday", - "2032-02-13": "The third day of Tet Holiday", - "2032-02-14": "The fourth day of Tet Holiday", - "2032-02-15": "The fifth day of Tet Holiday", + "2032-02-12": "Second Day of Lunar New Year", + "2032-02-13": "Third Day of Lunar New Year", + "2032-02-14": "Fourth Day of Lunar New Year", "2032-04-19": "Hung Kings' Commemoration Day", "2032-04-30": "Liberation Day/Reunification Day", "2032-05-01": "International Labor Day", "2032-05-03": "International Labor Day (observed)", "2032-09-02": "National Day", + "2032-09-03": "National Day", "2033-01-01": "New Year's Day", "2033-01-03": "New Year's Day (observed)", "2033-01-30": "Lunar New Year's Eve", "2033-01-31": "Lunar New Year", - "2033-02-01": "The second day of Tet Holiday", - "2033-02-02": "The third day of Tet Holiday", - "2033-02-03": "The fourth day of Tet Holiday", - "2033-02-04": "The fifth day of Tet Holiday", + "2033-02-01": "Second Day of Lunar New Year", + "2033-02-02": "Third Day of Lunar New Year", + "2033-02-03": "Fourth Day of Lunar New Year", + "2033-02-04": "Fifth Day of Lunar New Year", "2033-04-09": "Hung Kings' Commemoration Day", "2033-04-11": "Hung Kings' Commemoration Day (observed)", "2033-04-30": "Liberation Day/Reunification Day", "2033-05-01": "International Labor Day", "2033-05-02": "Liberation Day/Reunification Day (observed)", "2033-05-03": "International Labor Day (observed)", + "2033-09-01": "National Day", "2033-09-02": "National Day", "2034-01-01": "New Year's Day", "2034-01-02": "New Year's Day (observed)", + "2034-02-17": "29 of Lunar New Year", "2034-02-18": "Lunar New Year's Eve", "2034-02-19": "Lunar New Year", - "2034-02-20": "The second day of Tet Holiday", - "2034-02-21": "The third day of Tet Holiday", - "2034-02-22": "The fourth day of Tet Holiday", - "2034-02-23": "The fifth day of Tet Holiday", + "2034-02-20": "Second Day of Lunar New Year", + "2034-02-21": "Third Day of Lunar New Year", + "2034-02-22": "Fourth Day of Lunar New Year", + "2034-02-23": "Fifth Day of Lunar New Year", "2034-04-28": "Hung Kings' Commemoration Day", "2034-04-30": "Liberation Day/Reunification Day", "2034-05-01": "International Labor Day", "2034-05-02": "Liberation Day/Reunification Day (observed)", + "2034-09-01": "National Day", "2034-09-02": "National Day", "2034-09-04": "National Day (observed)", "2035-01-01": "New Year's Day", + "2035-02-06": "29 of Lunar New Year", "2035-02-07": "Lunar New Year's Eve", "2035-02-08": "Lunar New Year", - "2035-02-09": "The second day of Tet Holiday", - "2035-02-10": "The third day of Tet Holiday", - "2035-02-11": "The fourth day of Tet Holiday", - "2035-02-12": "The fifth day of Tet Holiday", + "2035-02-09": "Second Day of Lunar New Year", + "2035-02-10": "Third Day of Lunar New Year", + "2035-02-11": "Fourth Day of Lunar New Year", + "2035-02-12": "Fifth Day of Lunar New Year", "2035-04-17": "Hung Kings' Commemoration Day", "2035-04-30": "Liberation Day/Reunification Day", "2035-05-01": "International Labor Day", "2035-09-02": "National Day", - "2035-09-03": "National Day (observed)", + "2035-09-03": "National Day", + "2035-09-04": "National Day (observed)", "2036-01-01": "New Year's Day", "2036-01-27": "Lunar New Year's Eve", "2036-01-28": "Lunar New Year", - "2036-01-29": "The second day of Tet Holiday", - "2036-01-30": "The third day of Tet Holiday", - "2036-01-31": "The fourth day of Tet Holiday", - "2036-02-01": "The fifth day of Tet Holiday", + "2036-01-29": "Second Day of Lunar New Year", + "2036-01-30": "Third Day of Lunar New Year", + "2036-01-31": "Fourth Day of Lunar New Year", + "2036-02-01": "Fifth Day of Lunar New Year", "2036-04-06": "Hung Kings' Commemoration Day", "2036-04-07": "Hung Kings' Commemoration Day (observed)", "2036-04-30": "Liberation Day/Reunification Day", "2036-05-01": "International Labor Day", + "2036-09-01": "National Day", "2036-09-02": "National Day", "2037-01-01": "New Year's Day", + "2037-02-13": "29 of Lunar New Year", "2037-02-14": "Lunar New Year's Eve", "2037-02-15": "Lunar New Year", - "2037-02-16": "The second day of Tet Holiday", - "2037-02-17": "The third day of Tet Holiday", - "2037-02-18": "The fourth day of Tet Holiday", - "2037-02-19": "The fifth day of Tet Holiday", + "2037-02-16": "Second Day of Lunar New Year", + "2037-02-17": "Third Day of Lunar New Year", + "2037-02-18": "Fourth Day of Lunar New Year", + "2037-02-19": "Fifth Day of Lunar New Year", "2037-04-25": "Hung Kings' Commemoration Day", "2037-04-27": "Hung Kings' Commemoration Day (observed)", "2037-04-30": "Liberation Day/Reunification Day", "2037-05-01": "International Labor Day", + "2037-09-01": "National Day", "2037-09-02": "National Day", "2038-01-01": "New Year's Day", + "2038-02-02": "29 of Lunar New Year", "2038-02-03": "Lunar New Year's Eve", "2038-02-04": "Lunar New Year", - "2038-02-05": "The second day of Tet Holiday", - "2038-02-06": "The third day of Tet Holiday", - "2038-02-07": "The fourth day of Tet Holiday", - "2038-02-08": "The fifth day of Tet Holiday", + "2038-02-05": "Second Day of Lunar New Year", + "2038-02-06": "Third Day of Lunar New Year", + "2038-02-07": "Fourth Day of Lunar New Year", + "2038-02-08": "Fifth Day of Lunar New Year", "2038-04-14": "Hung Kings' Commemoration Day", "2038-04-30": "Liberation Day/Reunification Day", "2038-05-01": "International Labor Day", "2038-05-03": "International Labor Day (observed)", "2038-09-02": "National Day", + "2038-09-03": "National Day", "2039-01-01": "New Year's Day", "2039-01-03": "New Year's Day (observed)", "2039-01-23": "Lunar New Year's Eve", "2039-01-24": "Lunar New Year", - "2039-01-25": "The second day of Tet Holiday", - "2039-01-26": "The third day of Tet Holiday", - "2039-01-27": "The fourth day of Tet Holiday", - "2039-01-28": "The fifth day of Tet Holiday", + "2039-01-25": "Second Day of Lunar New Year", + "2039-01-26": "Third Day of Lunar New Year", + "2039-01-27": "Fourth Day of Lunar New Year", + "2039-01-28": "Fifth Day of Lunar New Year", "2039-04-03": "Hung Kings' Commemoration Day", "2039-04-04": "Hung Kings' Commemoration Day (observed)", "2039-04-30": "Liberation Day/Reunification Day", "2039-05-01": "International Labor Day", "2039-05-02": "Liberation Day/Reunification Day (observed)", "2039-05-03": "International Labor Day (observed)", + "2039-09-01": "National Day", "2039-09-02": "National Day", "2040-01-01": "New Year's Day", "2040-01-02": "New Year's Day (observed)", + "2040-02-10": "29 of Lunar New Year", "2040-02-11": "Lunar New Year's Eve", "2040-02-12": "Lunar New Year", - "2040-02-13": "The second day of Tet Holiday", - "2040-02-14": "The third day of Tet Holiday", - "2040-02-15": "The fourth day of Tet Holiday", - "2040-02-16": "The fifth day of Tet Holiday", + "2040-02-13": "Second Day of Lunar New Year", + "2040-02-14": "Third Day of Lunar New Year", + "2040-02-15": "Fourth Day of Lunar New Year", + "2040-02-16": "Fifth Day of Lunar New Year", "2040-04-20": "Hung Kings' Commemoration Day", "2040-04-30": "Liberation Day/Reunification Day", "2040-05-01": "International Labor Day", "2040-09-02": "National Day", - "2040-09-03": "National Day (observed)", + "2040-09-03": "National Day", + "2040-09-04": "National Day (observed)", "2041-01-01": "New Year's Day", + "2041-01-30": "29 of Lunar New Year", "2041-01-31": "Lunar New Year's Eve", "2041-02-01": "Lunar New Year", - "2041-02-02": "The second day of Tet Holiday", - "2041-02-03": "The third day of Tet Holiday", - "2041-02-04": "The fourth day of Tet Holiday", - "2041-02-05": "The fifth day of Tet Holiday", + "2041-02-02": "Second Day of Lunar New Year", + "2041-02-03": "Third Day of Lunar New Year", + "2041-02-04": "Fourth Day of Lunar New Year", + "2041-02-05": "Fifth Day of Lunar New Year", "2041-04-10": "Hung Kings' Commemoration Day", "2041-04-30": "Liberation Day/Reunification Day", "2041-05-01": "International Labor Day", "2041-09-02": "National Day", + "2041-09-03": "National Day", "2042-01-01": "New Year's Day", + "2042-01-20": "29 of Lunar New Year", "2042-01-21": "Lunar New Year's Eve", "2042-01-22": "Lunar New Year", - "2042-01-23": "The second day of Tet Holiday", - "2042-01-24": "The third day of Tet Holiday", - "2042-01-25": "The fourth day of Tet Holiday", - "2042-01-26": "The fifth day of Tet Holiday", + "2042-01-23": "Second Day of Lunar New Year", + "2042-01-24": "Third Day of Lunar New Year", + "2042-01-25": "Fourth Day of Lunar New Year", "2042-04-29": "Hung Kings' Commemoration Day", "2042-04-30": "Liberation Day/Reunification Day", "2042-05-01": "International Labor Day", + "2042-09-01": "National Day", "2042-09-02": "National Day", "2043-01-01": "New Year's Day", "2043-02-09": "Lunar New Year's Eve", "2043-02-10": "Lunar New Year", - "2043-02-11": "The second day of Tet Holiday", - "2043-02-12": "The third day of Tet Holiday", - "2043-02-13": "The fourth day of Tet Holiday", - "2043-02-14": "The fifth day of Tet Holiday", + "2043-02-11": "Second Day of Lunar New Year", + "2043-02-12": "Third Day of Lunar New Year", + "2043-02-13": "Fourth Day of Lunar New Year", "2043-04-19": "Hung Kings' Commemoration Day", "2043-04-20": "Hung Kings' Commemoration Day (observed)", "2043-04-30": "Liberation Day/Reunification Day", "2043-05-01": "International Labor Day", + "2043-09-01": "National Day", "2043-09-02": "National Day", "2044-01-01": "New Year's Day", + "2044-01-28": "29 of Lunar New Year", "2044-01-29": "Lunar New Year's Eve", "2044-01-30": "Lunar New Year", - "2044-01-31": "The second day of Tet Holiday", - "2044-02-01": "The third day of Tet Holiday", - "2044-02-02": "The fourth day of Tet Holiday", - "2044-02-03": "The fifth day of Tet Holiday", + "2044-01-31": "Second Day of Lunar New Year", + "2044-02-01": "Third Day of Lunar New Year", + "2044-02-02": "Fourth Day of Lunar New Year", + "2044-02-03": "Fifth Day of Lunar New Year", "2044-04-07": "Hung Kings' Commemoration Day", "2044-04-30": "Liberation Day/Reunification Day", "2044-05-01": "International Labor Day", "2044-05-02": "Liberation Day/Reunification Day (observed)", "2044-05-03": "International Labor Day (observed)", + "2044-09-01": "National Day", "2044-09-02": "National Day", "2045-01-01": "New Year's Day", "2045-01-02": "New Year's Day (observed)", + "2045-02-15": "29 of Lunar New Year", "2045-02-16": "Lunar New Year's Eve", "2045-02-17": "Lunar New Year", - "2045-02-18": "The second day of Tet Holiday", - "2045-02-19": "The third day of Tet Holiday", - "2045-02-20": "The fourth day of Tet Holiday", - "2045-02-21": "The fifth day of Tet Holiday", + "2045-02-18": "Second Day of Lunar New Year", + "2045-02-19": "Third Day of Lunar New Year", + "2045-02-20": "Fourth Day of Lunar New Year", + "2045-02-21": "Fifth Day of Lunar New Year", "2045-04-26": "Hung Kings' Commemoration Day", "2045-04-30": "Liberation Day/Reunification Day", "2045-05-01": "International Labor Day", "2045-05-02": "Liberation Day/Reunification Day (observed)", + "2045-09-01": "National Day", "2045-09-02": "National Day", "2045-09-04": "National Day (observed)", "2046-01-01": "New Year's Day", "2046-02-05": "Lunar New Year's Eve", "2046-02-06": "Lunar New Year", - "2046-02-07": "The second day of Tet Holiday", - "2046-02-08": "The third day of Tet Holiday", - "2046-02-09": "The fourth day of Tet Holiday", - "2046-02-10": "The fifth day of Tet Holiday", + "2046-02-07": "Second Day of Lunar New Year", + "2046-02-08": "Third Day of Lunar New Year", + "2046-02-09": "Fourth Day of Lunar New Year", "2046-04-15": "Hung Kings' Commemoration Day", "2046-04-16": "Hung Kings' Commemoration Day (observed)", "2046-04-30": "Liberation Day/Reunification Day", "2046-05-01": "International Labor Day", "2046-09-02": "National Day", - "2046-09-03": "National Day (observed)", + "2046-09-03": "National Day", + "2046-09-04": "National Day (observed)", "2047-01-01": "New Year's Day", + "2047-01-24": "29 of Lunar New Year", "2047-01-25": "Lunar New Year's Eve", "2047-01-26": "Lunar New Year", - "2047-01-27": "The second day of Tet Holiday", - "2047-01-28": "The third day of Tet Holiday", - "2047-01-29": "The fourth day of Tet Holiday", - "2047-01-30": "The fifth day of Tet Holiday", + "2047-01-27": "Second Day of Lunar New Year", + "2047-01-28": "Third Day of Lunar New Year", + "2047-01-29": "Fourth Day of Lunar New Year", + "2047-01-30": "Fifth Day of Lunar New Year", "2047-04-04": "Hung Kings' Commemoration Day", "2047-04-30": "Liberation Day/Reunification Day", "2047-05-01": "International Labor Day", "2047-09-02": "National Day", + "2047-09-03": "National Day", "2048-01-01": "New Year's Day", + "2048-02-12": "29 of Lunar New Year", "2048-02-13": "Lunar New Year's Eve", "2048-02-14": "Lunar New Year", - "2048-02-15": "The second day of Tet Holiday", - "2048-02-16": "The third day of Tet Holiday", - "2048-02-17": "The fourth day of Tet Holiday", - "2048-02-18": "The fifth day of Tet Holiday", + "2048-02-15": "Second Day of Lunar New Year", + "2048-02-16": "Third Day of Lunar New Year", + "2048-02-17": "Fourth Day of Lunar New Year", + "2048-02-18": "Fifth Day of Lunar New Year", "2048-04-22": "Hung Kings' Commemoration Day", "2048-04-30": "Liberation Day/Reunification Day", "2048-05-01": "International Labor Day", + "2048-09-01": "National Day", "2048-09-02": "National Day", "2049-01-01": "New Year's Day", "2049-02-01": "Lunar New Year's Eve", "2049-02-02": "Lunar New Year", - "2049-02-03": "The second day of Tet Holiday", - "2049-02-04": "The third day of Tet Holiday", - "2049-02-05": "The fourth day of Tet Holiday", - "2049-02-06": "The fifth day of Tet Holiday", + "2049-02-03": "Second Day of Lunar New Year", + "2049-02-04": "Third Day of Lunar New Year", + "2049-02-05": "Fourth Day of Lunar New Year", "2049-04-11": "Hung Kings' Commemoration Day", "2049-04-12": "Hung Kings' Commemoration Day (observed)", "2049-04-30": "Liberation Day/Reunification Day", "2049-05-01": "International Labor Day", "2049-05-03": "International Labor Day (observed)", "2049-09-02": "National Day", + "2049-09-03": "National Day", "2050-01-01": "New Year's Day", "2050-01-03": "New Year's Day (observed)", + "2050-01-21": "29 of Lunar New Year", "2050-01-22": "Lunar New Year's Eve", "2050-01-23": "Lunar New Year", - "2050-01-24": "The second day of Tet Holiday", - "2050-01-25": "The third day of Tet Holiday", - "2050-01-26": "The fourth day of Tet Holiday", - "2050-01-27": "The fifth day of Tet Holiday", + "2050-01-24": "Second Day of Lunar New Year", + "2050-01-25": "Third Day of Lunar New Year", + "2050-01-26": "Fourth Day of Lunar New Year", + "2050-01-27": "Fifth Day of Lunar New Year", "2050-04-01": "Hung Kings' Commemoration Day", "2050-04-30": "Liberation Day/Reunification Day", "2050-05-01": "International Labor Day", "2050-05-02": "Liberation Day/Reunification Day (observed)", "2050-05-03": "International Labor Day (observed)", + "2050-09-01": "National Day", "2050-09-02": "National Day" } diff --git a/tests/countries/test_vietnam.py b/tests/countries/test_vietnam.py index cce21f49e..620385282 100644 --- a/tests/countries/test_vietnam.py +++ b/tests/countries/test_vietnam.py @@ -32,7 +32,7 @@ def test_common(self): "2020-01-01", ) - def test_first_day_of_january(self): + def test_new_years_day(self): self.assertHolidayName("Tết Dương lịch", (f"{year}-01-01" for year in range(1979, 2050))) def test_lunar_new_year(self): @@ -53,21 +53,38 @@ def test_lunar_new_year(self): (2020, 1, 25), (2021, 2, 12), (2022, 2, 1), + (2023, 1, 22), + (2024, 2, 10), ): dt = date(*dts) self.assertHolidayName("Giao thừa Tết Nguyên Đán", _timedelta(dt, -1)) self.assertHolidayName("Tết Nguyên Đán", dt) self.assertHolidayName("Mùng hai Tết Nguyên Đán", _timedelta(dt, +1)) self.assertHolidayName("Mùng ba Tết Nguyên Đán", _timedelta(dt, +2)) - self.assertHolidayName("Mùng bốn Tết Nguyên Đán", _timedelta(dt, +3)) - self.assertHolidayName("Mùng năm Tết Nguyên Đán", _timedelta(dt, +4)) + if dt.year >= 2013: + self.assertHolidayName("Mùng bốn Tết Nguyên Đán", _timedelta(dt, +3)) - def test_king_hung_day(self): + def test_hung_kings_day(self): self.assertHolidayName( "Ngày Giỗ Tổ Hùng Vương", + "2007-04-26", + "2008-04-15", + "2009-04-05", + "2010-04-23", + "2011-04-12", + "2012-03-31", + "2013-04-19", + "2014-04-09", + "2015-04-28", + "2016-04-16", + "2017-04-06", + "2018-04-25", + "2019-04-14", "2020-04-02", "2021-04-21", "2022-04-10", + "2023-04-29", + "2024-04-18", ) def test_liberation_day(self): @@ -78,8 +95,15 @@ def test_international_labor_day(self): "Ngày Quốc tế Lao động", (f"{year}-05-01" for year in range(1979, 2050)) ) - def test_independence_day(self): - self.assertHolidayName("Quốc khánh", (f"{year}-09-02" for year in range(1979, 2050))) + def test_national_day(self): + self.assertHolidayName( + "Quốc khánh", + (f"{year}-09-02" for year in range(1979, 2050)), + "2021-09-03", + "2022-09-01", + "2023-09-01", + "2024-09-03", + ) def test_observed(self): observed_holidays = ( @@ -87,7 +111,29 @@ def test_observed(self): "2012-01-02", "2017-01-02", "2022-01-03", + # Lunar New Year. + "2012-01-26", + "2013-02-14", + "2013-02-15", + "2014-01-29", + "2014-02-04", + "2015-02-17", + "2015-02-23", + "2016-02-12", + "2017-01-26", + "2017-02-01", + "2018-02-14", + "2018-02-20", + "2020-01-23", + "2020-01-29", + "2021-02-10", + "2021-02-16", + "2023-01-20", + "2023-01-26", + "2024-02-08", + "2024-02-14", # Hung Kings' Commemoration Day. + "2009-04-06", "2012-04-02", "2016-04-18", "2019-04-15", @@ -113,6 +159,21 @@ def test_observed(self): self.assertHoliday(observed_holidays) self.assertNoNonObservedHoliday(observed_holidays) + def test_substituted_holidays(self): + self.assertHoliday( + "2010-02-19", + "2012-01-27", + "2013-04-29", + "2014-05-02", + "2014-09-01", + "2015-01-02", + "2015-02-16", + "2015-04-29", + "2018-12-31", + "2019-04-29", + "2024-04-29", + ) + def test_l10n_default(self): self.assertLocalizedHolidays( ("2022-01-01", "Tết Dương lịch"), @@ -122,13 +183,13 @@ def test_l10n_default(self): ("2022-02-02", "Mùng hai Tết Nguyên Đán"), ("2022-02-03", "Mùng ba Tết Nguyên Đán"), ("2022-02-04", "Mùng bốn Tết Nguyên Đán"), - ("2022-02-05", "Mùng năm Tết Nguyên Đán"), ("2022-04-10", "Ngày Giỗ Tổ Hùng Vương"), ("2022-04-11", "Ngày Giỗ Tổ Hùng Vương (nghỉ bù)"), ("2022-04-30", "Ngày Chiến thắng"), ("2022-05-01", "Ngày Quốc tế Lao động"), ("2022-05-02", "Ngày Chiến thắng (nghỉ bù)"), ("2022-05-03", "Ngày Quốc tế Lao động (nghỉ bù)"), + ("2022-09-01", "Quốc khánh"), ("2022-09-02", "Quốc khánh"), ) @@ -139,15 +200,15 @@ def test_l10n_en_us(self): ("2022-01-03", "New Year's Day (observed)"), ("2022-01-31", "Lunar New Year's Eve"), ("2022-02-01", "Lunar New Year"), - ("2022-02-02", "The second day of Tet Holiday"), - ("2022-02-03", "The third day of Tet Holiday"), - ("2022-02-04", "The fourth day of Tet Holiday"), - ("2022-02-05", "The fifth day of Tet Holiday"), + ("2022-02-02", "Second Day of Lunar New Year"), + ("2022-02-03", "Third Day of Lunar New Year"), + ("2022-02-04", "Fourth Day of Lunar New Year"), ("2022-04-10", "Hung Kings' Commemoration Day"), ("2022-04-11", "Hung Kings' Commemoration Day (observed)"), ("2022-04-30", "Liberation Day/Reunification Day"), ("2022-05-01", "International Labor Day"), ("2022-05-02", "Liberation Day/Reunification Day (observed)"), ("2022-05-03", "International Labor Day (observed)"), + ("2022-09-01", "National Day"), ("2022-09-02", "National Day"), ) From e492d09d5d923aef3590c2fbcdef64076b46c153 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 23:08:46 +0000 Subject: [PATCH 11/24] Bump coverage from 7.6.2 to 7.6.3 (#2058) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements/tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/tests.txt b/requirements/tests.txt index 89ca23270..1502315db 100644 --- a/requirements/tests.txt +++ b/requirements/tests.txt @@ -1,6 +1,6 @@ # Test requirements. -coverage==7.6.2 +coverage==7.6.3 importlib-metadata==8.5.0 numpy<2.1.0; python_version < '3.10' numpy==2.1.2; python_version >= '3.10' From f62614cf10d24d5746ce1d4337a202498813f3ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 23:10:07 +0000 Subject: [PATCH 12/24] Bump tox from 4.21.2 to 4.22.0 (#2057) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 1d109d7c4..2f2e669f2 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -8,6 +8,6 @@ lingva==5.0.4 pre-commit==4.0.1 pygithub==2.4.0 ruff==0.6.9 -tox==4.21.2 +tox==4.22.0 urllib3>=2.2.2 # not directly required, pinned by Snyk to avoid a vulnerability zipp>=3.19.1 # not directly required, pinned by Snyk to avoid a vulnerability From 34b4400a2a5a95f7ec37a262514c4e0d289a4fd3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 16:23:57 -0700 Subject: [PATCH 13/24] Bump cyclonedx-bom from 4.6.1 to 5.0.0 (#2056) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements/build.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/build.txt b/requirements/build.txt index 4d8c3604c..bf1d99444 100644 --- a/requirements/build.txt +++ b/requirements/build.txt @@ -1,3 +1,3 @@ build==1.2.2.post1 -cyclonedx-bom==4.6.1 +cyclonedx-bom==5.0.0 polib==1.2.0 From bb25790e5cae5d0759a04543b6659577f62c9746 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 16:40:40 -0700 Subject: [PATCH 14/24] Bump sphinx-rtd-theme from 2.0.0 to 3.0.1 (#2055) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements/docs.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/docs.txt b/requirements/docs.txt index 8dee31275..b6cc30442 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -1,6 +1,6 @@ # Documentation requirements. python-dateutil==2.9.0.post0 -sphinx-rtd-theme==2.0.0 +sphinx-rtd-theme==3.0.1 sphinx==7.4.7 # keep the version until sphinx-rtd-theme starts supporting sphinx>=8 zipp>=3.19.1 # not directly required, pinned by Snyk to avoid a vulnerability From 6750bf1761271edcf4fd6810e4ab0abf80477ff8 Mon Sep 17 00:00:00 2001 From: Arkadii Yakovets <2201626+arkid15r@users.noreply.github.com> Date: Thu, 17 Oct 2024 08:11:31 -0700 Subject: [PATCH 15/24] Satisfy mypy requirements (#2053) --- .pre-commit-config.yaml | 2 +- holidays/groups/buddhist.py | 16 ++++++++++------ holidays/groups/chinese.py | 18 +++++++++++------- holidays/groups/hindu.py | 16 ++++++++++------ 4 files changed, 32 insertions(+), 20 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e60438f96..69d4f5068 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -54,7 +54,7 @@ repos: exclude: ^(docs) - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.11.2 + rev: v1.12.0 hooks: - id: mypy additional_dependencies: diff --git a/holidays/groups/buddhist.py b/holidays/groups/buddhist.py index c537d0de5..271aa3994 100644 --- a/holidays/groups/buddhist.py +++ b/holidays/groups/buddhist.py @@ -26,7 +26,7 @@ def __init__(self, cls=None, show_estimated=False) -> None: self._buddhist_calendar_show_estimated = show_estimated def _add_buddhist_calendar_holiday( - self, name: str, dt_estimated: tuple[date, bool] + self, name: str, dt_estimated: tuple[Optional[date], bool] ) -> Optional[date]: """ Add Buddhist calendar holiday. @@ -37,11 +37,15 @@ def _add_buddhist_calendar_holiday( estimated_label = getattr(self, "estimated_label", "%s (estimated)") dt, is_estimated = dt_estimated - return self._add_holiday( - self.tr(estimated_label) % self.tr(name) - if is_estimated and self._buddhist_calendar_show_estimated - else name, - dt, + return ( + self._add_holiday( + self.tr(estimated_label) % self.tr(name) + if is_estimated and self._buddhist_calendar_show_estimated + else name, + dt, + ) + if dt + else None ) def _add_vesak(self, name) -> Optional[date]: diff --git a/holidays/groups/chinese.py b/holidays/groups/chinese.py index e2f78af62..95ec1a90f 100644 --- a/holidays/groups/chinese.py +++ b/holidays/groups/chinese.py @@ -48,7 +48,7 @@ def _mid_autumn_festival(self): return self._chinese_calendar.mid_autumn_date(self._year)[0] def _add_chinese_calendar_holiday( - self, name: str, dt_estimated: tuple[date, bool], days_delta: int = 0 + self, name: str, dt_estimated: tuple[Optional[date], bool], days_delta: int = 0 ) -> Optional[date]: """ Add Chinese calendar holiday. @@ -59,14 +59,18 @@ def _add_chinese_calendar_holiday( estimated_label = getattr(self, "estimated_label", "%s (estimated)") dt, is_estimated = dt_estimated - if days_delta != 0: + if days_delta and dt: dt = _timedelta(dt, days_delta) - return self._add_holiday( - self.tr(estimated_label) % self.tr(name) - if is_estimated and self._chinese_calendar_show_estimated - else name, - dt, + return ( + self._add_holiday( + self.tr(estimated_label) % self.tr(name) + if is_estimated and self._chinese_calendar_show_estimated + else name, + dt, + ) + if dt + else None ) def _add_chinese_birthday_of_buddha(self, name) -> Optional[date]: diff --git a/holidays/groups/hindu.py b/holidays/groups/hindu.py index 933b397e5..c5f8c2f00 100644 --- a/holidays/groups/hindu.py +++ b/holidays/groups/hindu.py @@ -26,7 +26,7 @@ def __init__(self, cls=None, show_estimated=False) -> None: self._hindu_calendar_show_estimated = show_estimated def _add_hindu_calendar_holiday( - self, name: str, dt_estimated: tuple[date, bool] + self, name: str, dt_estimated: tuple[Optional[date], bool] ) -> Optional[date]: """ Add Hindu calendar holiday. @@ -37,11 +37,15 @@ def _add_hindu_calendar_holiday( estimated_label = getattr(self, "estimated_label", "%s (estimated)") dt, is_estimated = dt_estimated - return self._add_holiday( - self.tr(estimated_label) % self.tr(name) - if is_estimated and self._hindu_calendar_show_estimated - else name, - dt, + return ( + self._add_holiday( + self.tr(estimated_label) % self.tr(name) + if is_estimated and self._hindu_calendar_show_estimated + else name, + dt, + ) + if dt + else None ) def _add_diwali(self, name) -> Optional[date]: From ed048eb83e9f423cab5e283e843610749b127246 Mon Sep 17 00:00:00 2001 From: Panpakorn Siripanich <19505219+PPsyrius@users.noreply.github.com> Date: Thu, 17 Oct 2024 22:34:42 +0700 Subject: [PATCH 16/24] Update Vietnam holidays: add `th` localization (#2060) --- README.rst | 2 +- holidays/countries/vietnam.py | 2 +- holidays/locale/th/LC_MESSAGES/VN.po | 93 ++++++++++++++++++++++++++++ tests/countries/test_vietnam.py | 20 ++++++ 4 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 holidays/locale/th/LC_MESSAGES/VN.po diff --git a/README.rst b/README.rst index 19960d789..9a04d173c 100644 --- a/README.rst +++ b/README.rst @@ -938,7 +938,7 @@ All other default values are highlighted with bold: * - Vietnam - VN - - - en_US, **vi** + - en_US, th, **vi** - * - Virgin Islands (U.S.) - VI diff --git a/holidays/countries/vietnam.py b/holidays/countries/vietnam.py index 7ddd842ad..347d36cff 100644 --- a/holidays/countries/vietnam.py +++ b/holidays/countries/vietnam.py @@ -59,7 +59,7 @@ class Vietnam(ObservedHolidayBase, ChineseCalendarHolidays, InternationalHoliday # %s (observed). observed_label = tr("%s (nghỉ bù)") default_language = "vi" - supported_languages = ("en_US", "vi") + supported_languages = ("en_US", "th", "vi") def __init__(self, *args, **kwargs): ChineseCalendarHolidays.__init__(self) diff --git a/holidays/locale/th/LC_MESSAGES/VN.po b/holidays/locale/th/LC_MESSAGES/VN.po new file mode 100644 index 000000000..a4a848fb1 --- /dev/null +++ b/holidays/locale/th/LC_MESSAGES/VN.po @@ -0,0 +1,93 @@ +# 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 AUTHORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) +# +# Vietnam holidays th localization. +# +msgid "" +msgstr "" +"Project-Id-Version: Holidays 0.59\n" +"POT-Creation-Date: 2024-09-27 15:50+0700\n" +"PO-Revision-Date: 2024-10-09 20:58+0300\n" +"Last-Translator: PPsyrius \n" +"Language-Team: Holidays Localization Team\n" +"Language: th\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Lingva 5.0.4\n" +"X-Generator: Poedit 3.5\n" + +#. %s (observed). +#, c-format +msgid "%s (nghỉ bù)" +msgstr "ชดเชย%s" + +#. New Year's Day. +msgid "Tết Dương lịch" +msgstr "วันปีใหม่สากล" + +#. 29 of Lunar New Year. +msgid "29 Tết" +msgstr "วันที่ 29 เดือน 12 ตามปฏิทินจันทรคติ" + +#. Lunar New Year's Eve. +msgid "Giao thừa Tết Nguyên Đán" +msgstr "วันก่อนวันตรุษเต๊ต" + +#. Lunar New Year. +msgid "Tết Nguyên Đán" +msgstr "วันตรุษเต๊ต" + +#. Second Day of Lunar New Year. +msgid "Mùng hai Tết Nguyên Đán" +msgstr "วันตรุษเต๊ตวันที่สอง" + +#. Third Day of Lunar New Year. +msgid "Mùng ba Tết Nguyên Đán" +msgstr "วันตรุษเต๊ตวันที่สาม" + +#. Fourth Day of Lunar New Year. +msgid "Mùng bốn Tết Nguyên Đán" +msgstr "วันตรุษเต๊ตวันที่สี่" + +#. Fifth Day of Lunar New Year. +msgid "Mùng năm Tết Nguyên Đán" +msgstr "วันตรุษเต๊ตวันที่ห้า" + +#. Sixth Day of Lunar New Year. +msgid "Mùng sáu Tết Nguyên Đán" +msgstr "วันตรุษเต๊ตวันที่หก" + +#. Hung Kings' Commemoration Day. +msgid "Ngày Giỗ Tổ Hùng Vương" +msgstr "วันสักการะบูชาบรรพกษัตริย์หุ่ง" + +#. Liberation Day/Reunification Day. +msgid "Ngày Chiến thắng" +msgstr "วันปลดปล่อยภาคใต้เพื่อรวมชาติ" + +#. International Labor Day. +msgid "Ngày Quốc tế Lao động" +msgstr "วันแรงงานสากล" + +#. National Day. +msgid "Quốc khánh" +msgstr "วันชาติเวียตนาม" + +#. Date format (see strftime() Format Codes). +msgid "%d/%m/%Y" +msgstr "%d/%m/%Y" + +#. Day off (substituted from %s). +#, c-format +msgid "Ngày nghỉ (thay cho ngày %s)" +msgstr "วันหยุด (แทน %s)" diff --git a/tests/countries/test_vietnam.py b/tests/countries/test_vietnam.py index 620385282..38e74235a 100644 --- a/tests/countries/test_vietnam.py +++ b/tests/countries/test_vietnam.py @@ -212,3 +212,23 @@ def test_l10n_en_us(self): ("2022-09-01", "National Day"), ("2022-09-02", "National Day"), ) + + def test_l10n_th(self): + self.assertLocalizedHolidays( + "th", + ("2022-01-01", "วันปีใหม่สากล"), + ("2022-01-03", "ชดเชยวันปีใหม่สากล"), + ("2022-01-31", "วันก่อนวันตรุษเต๊ต"), + ("2022-02-01", "วันตรุษเต๊ต"), + ("2022-02-02", "วันตรุษเต๊ตวันที่สอง"), + ("2022-02-03", "วันตรุษเต๊ตวันที่สาม"), + ("2022-02-04", "วันตรุษเต๊ตวันที่สี่"), + ("2022-04-10", "วันสักการะบูชาบรรพกษัตริย์หุ่ง"), + ("2022-04-11", "ชดเชยวันสักการะบูชาบรรพกษัตริย์หุ่ง"), + ("2022-04-30", "วันปลดปล่อยภาคใต้เพื่อรวมชาติ"), + ("2022-05-01", "วันแรงงานสากล"), + ("2022-05-02", "ชดเชยวันปลดปล่อยภาคใต้เพื่อรวมชาติ"), + ("2022-05-03", "ชดเชยวันแรงงานสากล"), + ("2022-09-01", "วันชาติเวียตนาม"), + ("2022-09-02", "วันชาติเวียตนาม"), + ) From b0a7ecb6b84a35acc0a927da7684caebb41505e1 Mon Sep 17 00:00:00 2001 From: konstantin Date: Thu, 17 Oct 2024 17:47:56 +0200 Subject: [PATCH 17/24] Update Germany holidays: add Liberation from Nazi Regime Day 2025 in Berlin (#2052) Co-authored-by: Konstantin Co-authored-by: PPsyrius <19505219+PPsyrius@users.noreply.github.com> --- holidays/countries/germany.py | 10 ++++++++++ holidays/locale/de/LC_MESSAGES/DE.po | 15 +++++++++++---- holidays/locale/en_US/LC_MESSAGES/DE.po | 17 +++++++++++++---- holidays/locale/th/LC_MESSAGES/DE.po | 13 +++++++++++-- holidays/locale/uk/LC_MESSAGES/DE.po | 17 +++++++++++++---- snapshots/countries/DE_BE.json | 1 + tests/countries/test_germany.py | 9 +++++++++ 7 files changed, 68 insertions(+), 14 deletions(-) diff --git a/holidays/countries/germany.py b/holidays/countries/germany.py index 771e2ca6f..5f00cc033 100644 --- a/holidays/countries/germany.py +++ b/holidays/countries/germany.py @@ -319,4 +319,14 @@ class GermanyStaticHolidays: "und der Beendigung des Zweiten Weltkriegs in Europa" ), ), + 2025: ( + MAY, + 8, + # 80th anniversary of the liberation from Nazism and + # the end of the Second World War in Europe. + tr( + "80. Jahrestag der Befreiung vom Nationalsozialismus " + "und der Beendigung des Zweiten Weltkriegs in Europa" + ), + ), } diff --git a/holidays/locale/de/LC_MESSAGES/DE.po b/holidays/locale/de/LC_MESSAGES/DE.po index 5e75fd8d6..81b4e6bff 100644 --- a/holidays/locale/de/LC_MESSAGES/DE.po +++ b/holidays/locale/de/LC_MESSAGES/DE.po @@ -13,10 +13,10 @@ # Germany holidays. msgid "" msgstr "" -"Project-Id-Version: Holidays 0.23\n" +"Project-Id-Version: Holidays 0.59\n" "POT-Creation-Date: 2023-04-04 16:13+0300\n" -"PO-Revision-Date: 2023-04-09 18:41+0300\n" -"Last-Translator: ~Jhellico \n" +"PO-Revision-Date: 2024-10-17 11:43+0700\n" +"Last-Translator: PPsyrius \n" "Language-Team: Holidays localization team\n" "Language: de\n" "MIME-Version: 1.0\n" @@ -24,7 +24,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.5\n" #. New Year's Day. msgid "Neujahr" @@ -89,6 +89,13 @@ msgid "" "Zweiten Weltkriegs in Europa" msgstr "" +#. 80th anniversary of the liberation from Nazism and the end of the Second +#. World War in Europe. +msgid "" +"80. Jahrestag der Befreiung vom Nationalsozialismus und der Beendigung des " +"Zweiten Weltkriegs in Europa" +msgstr "" + #. Epiphany. msgid "Heilige Drei Könige" msgstr "" diff --git a/holidays/locale/en_US/LC_MESSAGES/DE.po b/holidays/locale/en_US/LC_MESSAGES/DE.po index 9cef7b141..6020e2d0f 100644 --- a/holidays/locale/en_US/LC_MESSAGES/DE.po +++ b/holidays/locale/en_US/LC_MESSAGES/DE.po @@ -14,10 +14,10 @@ # msgid "" msgstr "" -"Project-Id-Version: Holidays 0.23\n" +"Project-Id-Version: Holidays 0.59\n" "POT-Creation-Date: 2023-04-04 16:13+0300\n" -"PO-Revision-Date: 2023-04-09 18:42+0300\n" -"Last-Translator: ~Jhellico \n" +"PO-Revision-Date: 2024-10-17 11:43+0700\n" +"Last-Translator: PPsyrius \n" "Language-Team: Holidays localization team\n" "Language: en_US\n" "MIME-Version: 1.0\n" @@ -25,7 +25,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.5\n" #. New Year's Day. msgid "Neujahr" @@ -92,6 +92,15 @@ msgstr "" "75th anniversary of the liberation from Nazism and the end of the Second " "World War in Europe" +#. 80th anniversary of the liberation from Nazism and the end of the Second +#. World War in Europe. +msgid "" +"80. Jahrestag der Befreiung vom Nationalsozialismus und der Beendigung des " +"Zweiten Weltkriegs in Europa" +msgstr "" +"80th anniversary of the liberation from Nazism and the end of the Second " +"World War in Europe" + #. Epiphany. msgid "Heilige Drei Könige" msgstr "Epiphany" diff --git a/holidays/locale/th/LC_MESSAGES/DE.po b/holidays/locale/th/LC_MESSAGES/DE.po index 2cd20febf..601c49542 100644 --- a/holidays/locale/th/LC_MESSAGES/DE.po +++ b/holidays/locale/th/LC_MESSAGES/DE.po @@ -14,9 +14,9 @@ # msgid "" msgstr "" -"Project-Id-Version: Holidays 0.57\n" +"Project-Id-Version: Holidays 0.59\n" "POT-Creation-Date: 2024-09-05 23:21+0700\n" -"PO-Revision-Date: 2024-09-05 23:23+0700\n" +"PO-Revision-Date: 2024-10-17 11:44+0700\n" "Last-Translator: PPsyrius \n" "Language-Team: Holidays Localization Team\n" "Language: th\n" @@ -92,6 +92,15 @@ msgstr "" "วันครบรอบ 75 " "ปีของการปลดปล่อยจากระบอบชาติสังคมนิยมและการสิ้นสุดสงครามโลกครั้งที่สองในยุโรป" +#. 80th anniversary of the liberation from Nazism and the end of the Second +#. World War in Europe. +msgid "" +"80. Jahrestag der Befreiung vom Nationalsozialismus und der Beendigung des " +"Zweiten Weltkriegs in Europa" +msgstr "" +"วันครบรอบ 80 " +"ปีของการปลดปล่อยจากระบอบชาติสังคมนิยมและการสิ้นสุดสงครามโลกครั้งที่สองในยุโรป" + #. Epiphany. msgid "Heilige Drei Könige" msgstr "วันสมโภชพระคริสต์แสดงองค์" diff --git a/holidays/locale/uk/LC_MESSAGES/DE.po b/holidays/locale/uk/LC_MESSAGES/DE.po index a19313a8d..b31b024e5 100644 --- a/holidays/locale/uk/LC_MESSAGES/DE.po +++ b/holidays/locale/uk/LC_MESSAGES/DE.po @@ -14,10 +14,10 @@ # msgid "" msgstr "" -"Project-Id-Version: Holidays 0.23\n" +"Project-Id-Version: Holidays 0.59\n" "POT-Creation-Date: 2023-04-04 16:13+0300\n" -"PO-Revision-Date: 2023-04-09 18:42+0300\n" -"Last-Translator: ~Jhellico \n" +"PO-Revision-Date: 2024-10-17 11:44+0700\n" +"Last-Translator: PPsyrius \n" "Language-Team: Holidays localization team\n" "Language: uk\n" "MIME-Version: 1.0\n" @@ -25,7 +25,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.5\n" #. New Year's Day. msgid "Neujahr" @@ -92,6 +92,15 @@ msgstr "" "75-та річниця визволення від націонал-соціалізму та завершення Другої " "світової війни в Європі" +#. 80th anniversary of the liberation from Nazism and the end of the Second +#. World War in Europe. +msgid "" +"80. Jahrestag der Befreiung vom Nationalsozialismus und der Beendigung des " +"Zweiten Weltkriegs in Europa" +msgstr "" +"80-та річниця визволення від націонал-соціалізму та завершення Другої " +"світової війни в Європі" + #. Epiphany. msgid "Heilige Drei Könige" msgstr "Богоявлення" diff --git a/snapshots/countries/DE_BE.json b/snapshots/countries/DE_BE.json index 59189e581..fec5b8d19 100644 --- a/snapshots/countries/DE_BE.json +++ b/snapshots/countries/DE_BE.json @@ -325,6 +325,7 @@ "2025-04-18": "Good Friday", "2025-04-21": "Easter Monday", "2025-05-01": "Labor Day", + "2025-05-08": "80th anniversary of the liberation from Nazism and the end of the Second World War in Europe", "2025-05-29": "Ascension Day", "2025-06-09": "Whit Monday", "2025-10-03": "German Unity Day", diff --git a/tests/countries/test_germany.py b/tests/countries/test_germany.py index 7363aa95e..e35b3d5a1 100644 --- a/tests/countries/test_germany.py +++ b/tests/countries/test_germany.py @@ -197,6 +197,15 @@ def test_75_jahrestag_beendigung_zweiter_weltkrieg(self): for subdiv in subdivs_that_dont: self.assertNoHoliday(self.subdiv_holidays[subdiv], "2020-05-08") + def test_80_jahrestag_beendigung_zweiter_weltkrieg(self): + subdivs_that_have = {"BE"} + subdivs_that_dont = set(DE.subdivisions) - subdivs_that_have + + for subdiv in subdivs_that_have: + self.assertHoliday(self.subdiv_holidays[subdiv], "2025-05-08") + for subdiv in subdivs_that_dont: + self.assertNoHoliday(self.subdiv_holidays[subdiv], "2025-05-08") + def test_christi_himmelfahrt(self): known_good = ( "2014-05-29", From 15fc1970584cc8d8376f4b840c94cc62f658be7a Mon Sep 17 00:00:00 2001 From: ~Jhellico Date: Thu, 17 Oct 2024 21:58:54 +0300 Subject: [PATCH 18/24] Add `EasternCalendarHolidays` to holidays groups (#2062) --- holidays/groups/__init__.py | 1 + holidays/groups/buddhist.py | 17 +++---------- holidays/groups/chinese.py | 22 ++++------------ holidays/groups/eastern.py | 51 +++++++++++++++++++++++++++++++++++++ holidays/groups/hindu.py | 17 +++---------- holidays/groups/islamic.py | 15 +++-------- 6 files changed, 69 insertions(+), 54 deletions(-) create mode 100644 holidays/groups/eastern.py diff --git a/holidays/groups/__init__.py b/holidays/groups/__init__.py index 587c61518..a825b59e0 100644 --- a/holidays/groups/__init__.py +++ b/holidays/groups/__init__.py @@ -16,6 +16,7 @@ from holidays.groups.chinese import ChineseCalendarHolidays from holidays.groups.christian import ChristianHolidays from holidays.groups.custom import StaticHolidays +from holidays.groups.eastern import EasternCalendarHolidays from holidays.groups.hindu import HinduCalendarHolidays from holidays.groups.international import InternationalHolidays from holidays.groups.islamic import IslamicHolidays diff --git a/holidays/groups/buddhist.py b/holidays/groups/buddhist.py index 271aa3994..f74870bd7 100644 --- a/holidays/groups/buddhist.py +++ b/holidays/groups/buddhist.py @@ -14,9 +14,10 @@ from typing import Optional from holidays.calendars import _BuddhistLunisolar +from holidays.groups.eastern import EasternCalendarHolidays -class BuddhistCalendarHolidays: +class BuddhistCalendarHolidays(EasternCalendarHolidays): """ Buddhist lunisolar calendar holidays. """ @@ -34,18 +35,8 @@ def _add_buddhist_calendar_holiday( Adds customizable estimation label to holiday name if holiday date is an estimation. """ - estimated_label = getattr(self, "estimated_label", "%s (estimated)") - dt, is_estimated = dt_estimated - - return ( - self._add_holiday( - self.tr(estimated_label) % self.tr(name) - if is_estimated and self._buddhist_calendar_show_estimated - else name, - dt, - ) - if dt - else None + return self._add_eastern_calendar_holiday( + name, dt_estimated, self._buddhist_calendar_show_estimated ) def _add_vesak(self, name) -> Optional[date]: diff --git a/holidays/groups/chinese.py b/holidays/groups/chinese.py index 95ec1a90f..b3597e625 100644 --- a/holidays/groups/chinese.py +++ b/holidays/groups/chinese.py @@ -14,10 +14,11 @@ from typing import Optional from holidays.calendars import _ChineseLunisolar -from holidays.calendars.gregorian import APR, _timedelta +from holidays.calendars.gregorian import APR +from holidays.groups.eastern import EasternCalendarHolidays -class ChineseCalendarHolidays: +class ChineseCalendarHolidays(EasternCalendarHolidays): """ Chinese lunisolar calendar holidays. """ @@ -56,21 +57,8 @@ def _add_chinese_calendar_holiday( Adds customizable estimation label to holiday name if holiday date is an estimation. """ - estimated_label = getattr(self, "estimated_label", "%s (estimated)") - dt, is_estimated = dt_estimated - - if days_delta and dt: - dt = _timedelta(dt, days_delta) - - return ( - self._add_holiday( - self.tr(estimated_label) % self.tr(name) - if is_estimated and self._chinese_calendar_show_estimated - else name, - dt, - ) - if dt - else None + return self._add_eastern_calendar_holiday( + name, dt_estimated, self._chinese_calendar_show_estimated, days_delta ) def _add_chinese_birthday_of_buddha(self, name) -> Optional[date]: diff --git a/holidays/groups/eastern.py b/holidays/groups/eastern.py new file mode 100644 index 000000000..4cd2d04e0 --- /dev/null +++ b/holidays/groups/eastern.py @@ -0,0 +1,51 @@ +# 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 AUTHORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (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 _timedelta + + +class EasternCalendarHolidays: + """ + Eastern calendar holidays base class. + """ + + def _add_eastern_calendar_holiday( + self, + name: str, + dt_estimated: tuple[Optional[date], bool], + show_estimated: bool = True, + days_delta: int = 0, + ) -> Optional[date]: + """ + Add Eastern (Buddhist, Chinese, Hindu, Islamic) calendar holiday. + + Adds customizable estimation label to holiday name if holiday date is an estimation. + """ + estimated_label = getattr(self, "estimated_label", "%s (estimated)") + dt, is_estimated = dt_estimated + + if days_delta and dt: + dt = _timedelta(dt, days_delta) + + return ( + self._add_holiday( + self.tr(estimated_label) % self.tr(name) + if is_estimated and show_estimated + else name, + dt, + ) + if dt + else None + ) diff --git a/holidays/groups/hindu.py b/holidays/groups/hindu.py index c5f8c2f00..e6f78e9dd 100644 --- a/holidays/groups/hindu.py +++ b/holidays/groups/hindu.py @@ -14,9 +14,10 @@ from typing import Optional from holidays.calendars import _HinduLunisolar +from holidays.groups.eastern import EasternCalendarHolidays -class HinduCalendarHolidays: +class HinduCalendarHolidays(EasternCalendarHolidays): """ Hindu lunisolar calendar holidays. """ @@ -34,18 +35,8 @@ def _add_hindu_calendar_holiday( Adds customizable estimation label to holiday name if holiday date is an estimation. """ - estimated_label = getattr(self, "estimated_label", "%s (estimated)") - dt, is_estimated = dt_estimated - - return ( - self._add_holiday( - self.tr(estimated_label) % self.tr(name) - if is_estimated and self._hindu_calendar_show_estimated - else name, - dt, - ) - if dt - else None + return self._add_eastern_calendar_holiday( + name, dt_estimated, self._hindu_calendar_show_estimated ) def _add_diwali(self, name) -> Optional[date]: diff --git a/holidays/groups/islamic.py b/holidays/groups/islamic.py index 7fef07410..a86853fca 100644 --- a/holidays/groups/islamic.py +++ b/holidays/groups/islamic.py @@ -14,10 +14,10 @@ from datetime import date from holidays.calendars import _IslamicLunar -from holidays.calendars.gregorian import _timedelta +from holidays.groups.eastern import EasternCalendarHolidays -class IslamicHolidays: +class IslamicHolidays(EasternCalendarHolidays): """ Islamic holidays. @@ -261,15 +261,8 @@ def _add_islamic_calendar_holiday( holiday date is an estimation. """ added_dates = set() - estimated_label = getattr(self, "estimated_label", "%s (estimated)") - for dt, is_estimated in dates: - if days_delta != 0: - dt = _timedelta(dt, days_delta) - - dt = self._add_holiday( - self.tr(estimated_label) % self.tr(name) if is_estimated else name, dt - ) - if dt: + for dts in dates: + if dt := self._add_eastern_calendar_holiday(name, dts, days_delta=days_delta): added_dates.add(dt) return added_dates From ce852f70f0a3dee2ae6bf4ae8c109ede56ed5e8e Mon Sep 17 00:00:00 2001 From: Arkadii Yakovets <2201626+arkid15r@users.noreply.github.com> Date: Thu, 17 Oct 2024 12:15:24 -0700 Subject: [PATCH 19/24] Update `holidays` package metadata (#2063) --- pyproject.toml | 27 ++++++++++++++++----------- tests/test_package.py | 9 ++++++--- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index be5daac88..3706253df 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,38 +1,43 @@ [project] name = "holidays" -description = "Generate and work with holidays in Python" -license = { file = "LICENSE" } +description = "World Holidays Framework" +license = { "text" = "MIT" } readme = "README.rst" requires-python = ">=3.9" dynamic = ["version"] -authors = [{ email = "dr.prodigy.github@gmail.com", name = "Maurizio Montel" }] +authors = [{ name = "Vacanza Team" }] dependencies = ["python-dateutil"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", + "Intended Audience :: Education", + "Intended Audience :: End Users/Desktop", + "Intended Audience :: Financial and Insurance Industry", + "Intended Audience :: Information Technology", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy", + "Topic :: File Formats :: JSON", + "Topic :: Office/Business :: Financial :: Accounting", + "Topic :: Office/Business :: Financial :: Investment", "Topic :: Office/Business :: Scheduling", "Topic :: Software Development :: Libraries :: Python Modules", - "Topic :: Software Development :: Localization", ] -keywords = ["holidays", "calendar", "l10n"] +keywords = ["holidays", "calendar", "l10n", "worldwide", "vacation"] maintainers = [ - { email = "ark@cho.red", name = "Arkadii Yakovets" }, - { email = "jhellico@gmail.com", name = "Serhii Murza" }, + { name = "Arkadii Yakovets" }, + { name = "Panpakorn Siripanich" }, + { name = "Serhii Murza" }, ] [project.urls] -Repository = "https://github.com/vacanza/holidays/" Documentation = "https://holidays.readthedocs.io/en/latest/" -Changelog = "https://github.com/vacanza/holidays/releases" -Downloads = "https://pypi.org/project/holidays/" +Repository = "https://github.com/vacanza/holidays/" +Changelog = "https://github.com/vacanza/holidays/releases/" [tool.bandit] exclude_dirs = ["docs", "tests"] diff --git a/tests/test_package.py b/tests/test_package.py index 46ca64367..009f03f95 100644 --- a/tests/test_package.py +++ b/tests/test_package.py @@ -23,22 +23,25 @@ def test_metadata(self): for attr_name, attr_value in { "name": "holidays", - "summary": "Generate and work with holidays in Python", + "summary": "World Holidays Framework", "version": holidays.__version__, }.items(): self.assertIn(attr_name, ph_metadata) self.assertEqual(ph_metadata[attr_name], attr_value, attr_name) for attr_name in ( - "author-email", "classifier", "description", "keywords", "license", "license-file", - "maintainer-email", + "maintainer", "project-url", "requires-python", ): self.assertIn(attr_name, ph_metadata) self.assertTrue(ph_metadata[attr_name], attr_name) + + if attr_name == "maintainer": + for maintainer in ("Arkadii Yakovets", "Panpakorn Siripanich", "Serhii Murza"): + self.assertIn(maintainer, ph_metadata["maintainer"]) From 96d85fa58f492a7906c07ac221fd336301b3a41d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 18 Oct 2024 09:12:05 -0700 Subject: [PATCH 20/24] Update pre-commit hooks (#2065) Co-authored-by: arkid15r <2201626+arkid15r@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 69d4f5068..be76f1e27 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -23,7 +23,7 @@ repos: - --py39-plus - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.6.9 + rev: v0.7.0 hooks: - id: ruff - id: ruff-format From 1e81ae88f0d12870962cb498006c3f20e4a3d335 Mon Sep 17 00:00:00 2001 From: ~Jhellico Date: Fri, 18 Oct 2024 19:47:31 +0300 Subject: [PATCH 21/24] Update `InternationalHolidays::_add_world_war_two_victory_day()` method (#2064) --- holidays/countries/armenia.py | 7 +++++-- holidays/countries/azerbaijan.py | 9 +++++++-- holidays/countries/belarus.py | 2 +- holidays/countries/bosnia_and_herzegovina.py | 4 ++-- holidays/countries/czechia.py | 9 ++++++--- holidays/countries/france.py | 2 +- holidays/countries/georgia.py | 2 +- holidays/countries/kazakhstan.py | 2 +- holidays/countries/kyrgyzstan.py | 2 +- holidays/countries/moldova.py | 7 ++++--- holidays/countries/russia.py | 2 +- holidays/countries/slovakia.py | 2 +- holidays/countries/ukraine.py | 4 +--- holidays/countries/uzbekistan.py | 3 ++- holidays/groups/international.py | 13 ++++++++----- 15 files changed, 42 insertions(+), 28 deletions(-) diff --git a/holidays/countries/armenia.py b/holidays/countries/armenia.py index 17fda98b4..937e1081c 100644 --- a/holidays/countries/armenia.py +++ b/holidays/countries/armenia.py @@ -82,8 +82,11 @@ def _populate_public_holidays(self): ) if self._year >= 1995: - # Victory and Peace Day. - self._add_world_war_two_victory_day(tr("Հաղթանակի և Խաղաղության տոն")) + self._add_world_war_two_victory_day( + # Victory and Peace Day. + tr("Հաղթանակի և Խաղաղության տոն"), + is_western=False, + ) # Republic Day. self._add_holiday_may_28(tr("Հանրապետության օր")) diff --git a/holidays/countries/azerbaijan.py b/holidays/countries/azerbaijan.py index cd02b78d0..4562f3795 100644 --- a/holidays/countries/azerbaijan.py +++ b/holidays/countries/azerbaijan.py @@ -78,8 +78,13 @@ def _populate_public_holidays(self): dts_observed.add(self._add_holiday_mar_23(name)) dts_observed.add(self._add_holiday_mar_24(name)) - # Victory over Fascism Day. - dts_observed.add(self._add_world_war_two_victory_day(tr("Faşizm üzərində qələbə günü"))) + dts_observed.add( + self._add_world_war_two_victory_day( + # Victory over Fascism Day. + tr("Faşizm üzərində qələbə günü"), + is_western=False, + ) + ) if self._year >= 1992: dts_observed.add( diff --git a/holidays/countries/belarus.py b/holidays/countries/belarus.py index 781a7831e..d209f0963 100644 --- a/holidays/countries/belarus.py +++ b/holidays/countries/belarus.py @@ -64,7 +64,7 @@ def _populate_public_holidays(self): self._add_labor_day(tr("Свята працы")) # Victory Day. - self._add_world_war_two_victory_day(tr("Дзень Перамогі")) + self._add_world_war_two_victory_day(tr("Дзень Перамогі"), is_western=False) # Independence Day. self._add_holiday_jul_3(tr("Дзень Незалежнасці Рэспублікі Беларусь (Дзень Рэспублікі)")) diff --git a/holidays/countries/bosnia_and_herzegovina.py b/holidays/countries/bosnia_and_herzegovina.py index 0ca8b0649..91cbf2e1a 100644 --- a/holidays/countries/bosnia_and_herzegovina.py +++ b/holidays/countries/bosnia_and_herzegovina.py @@ -146,7 +146,7 @@ def _populate_subdiv_bih_public_holidays(self): self._add_labor_day_two(name) # Victory Day. - self._add_world_war_two_victory_day(tr("Dan pobjede nad fašizmom")) + self._add_world_war_two_victory_day(tr("Dan pobjede nad fašizmom"), is_western=False) # Statehood Day. self._add_holiday_nov_25(tr("Dan državnosti")) @@ -220,7 +220,7 @@ def _populate_subdiv_srp_public_holidays(self): self._add_labor_day_two(name) # Victory Day. - self._add_world_war_two_victory_day(tr("Dan pobjede nad fašizmom")) + self._add_world_war_two_victory_day(tr("Dan pobjede nad fašizmom"), is_western=False) self._add_holiday_nov_21( # Dayton Agreement Day. diff --git a/holidays/countries/czechia.py b/holidays/countries/czechia.py index 888037afa..f1e34b787 100644 --- a/holidays/countries/czechia.py +++ b/holidays/countries/czechia.py @@ -52,10 +52,13 @@ def _populate_public_holidays(self): if self._year >= 1992: # Victory Day. - self._add_holiday_may_8(tr("Den vítězství")) + self._add_world_war_two_victory_day(tr("Den vítězství")) elif self._year >= 1947: - # Day of Victory over Fascism. - self._add_world_war_two_victory_day(tr("Den vítězství nad hitlerovským fašismem")) + self._add_world_war_two_victory_day( + # Day of Victory over Fascism. + tr("Den vítězství nad hitlerovským fašismem"), + is_western=False, + ) if self._year >= 1951: # Saints Cyril and Methodius Day. diff --git a/holidays/countries/france.py b/holidays/countries/france.py index 663e2f61a..28623497b 100644 --- a/holidays/countries/france.py +++ b/holidays/countries/france.py @@ -85,7 +85,7 @@ def _populate_public_holidays(self): if 1953 <= self._year <= 1959 or self._year >= 1982: # Victory Day. - self._add_holiday_may_8(tr("Fête de la Victoire")) + self._add_world_war_two_victory_day(tr("Fête de la Victoire")) if self._year >= 1880: # National Day. diff --git a/holidays/countries/georgia.py b/holidays/countries/georgia.py index 988efeaf3..d68034362 100644 --- a/holidays/countries/georgia.py +++ b/holidays/countries/georgia.py @@ -76,7 +76,7 @@ def _populate_public_holidays(self): self._add_holiday_apr_9(tr("ეროვნული ერთიანობის დღე")) # Day of Victory over Fascism. - self._add_world_war_two_victory_day(tr("ფაშიზმზე გამარჯვების დღე")) + self._add_world_war_two_victory_day(tr("ფაშიზმზე გამარჯვების დღე"), is_western=False) # Saint Andrew's Day. self._add_holiday_may_12(tr("წმინდა ანდრია პირველწოდებულის დღე")) diff --git a/holidays/countries/kazakhstan.py b/holidays/countries/kazakhstan.py index 5f7467a58..836146cb7 100644 --- a/holidays/countries/kazakhstan.py +++ b/holidays/countries/kazakhstan.py @@ -130,7 +130,7 @@ def _populate_public_holidays(self): dts_observed.add(self._add_holiday_may_7(tr("Отан Қорғаушы күні"))) # Victory Day. - dt = self._add_world_war_two_victory_day(tr("Жеңіс күні")) + dt = self._add_world_war_two_victory_day(tr("Жеңіс күні"), is_western=False) if self._year != 2020: dts_observed.add(dt) diff --git a/holidays/countries/kyrgyzstan.py b/holidays/countries/kyrgyzstan.py index ac2146434..4fc9c86c0 100644 --- a/holidays/countries/kyrgyzstan.py +++ b/holidays/countries/kyrgyzstan.py @@ -58,7 +58,7 @@ def _populate_public_holidays(self): self._add_holiday_may_5("Constitution Day") # Victory Day. - self._add_world_war_two_victory_day("Victory Day") + self._add_world_war_two_victory_day("Victory Day", is_western=False) # Independence Day. self._add_holiday_aug_31("Independence Day") diff --git a/holidays/countries/moldova.py b/holidays/countries/moldova.py index 813224f1d..3858d9717 100644 --- a/holidays/countries/moldova.py +++ b/holidays/countries/moldova.py @@ -64,15 +64,16 @@ def _populate_public_holidays(self): # International Workers' Solidarity Day. self._add_labor_day(tr("Ziua internaţională a solidarităţii oamenilor muncii")) - may_9 = self._add_world_war_two_victory_day( + self._add_world_war_two_victory_day( # Victory Day and Commemoration of the heroes fallen for # Independence of Fatherland. - tr("Ziua Victoriei și a comemorării eroilor căzuţi pentru Independenţa Patriei") + tr("Ziua Victoriei și a comemorării eroilor căzuţi pentru Independenţa Patriei"), + is_western=False, ) if self._year >= 2017: # Europe Day. - self._add_holiday(tr("Ziua Europei"), may_9) + self._add_holiday_may_9(tr("Ziua Europei")) if self._year >= 2016: # International Children's Day. diff --git a/holidays/countries/russia.py b/holidays/countries/russia.py index 05589e9db..c2c8aff60 100644 --- a/holidays/countries/russia.py +++ b/holidays/countries/russia.py @@ -75,7 +75,7 @@ def _populate_public_holidays(self): self._add_labor_day_two(name) # Victory Day. - self._add_world_war_two_victory_day(tr("День Победы")) + self._add_world_war_two_victory_day(tr("День Победы"), is_western=False) if self._year >= 1992: self._add_holiday_jun_12( diff --git a/holidays/countries/slovakia.py b/holidays/countries/slovakia.py index 283668a30..726e72df1 100644 --- a/holidays/countries/slovakia.py +++ b/holidays/countries/slovakia.py @@ -60,7 +60,7 @@ def _populate_public_holidays(self): if self._year >= 1997: # Day of Victory over Fascism. - self._add_holiday_may_8(tr("Deň víťazstva nad fašizmom")) + self._add_world_war_two_victory_day(tr("Deň víťazstva nad fašizmom")) # Saints Cyril and Methodius Day. self._add_holiday_jul_5(tr("Sviatok svätého Cyrila a svätého Metoda")) diff --git a/holidays/countries/ukraine.py b/holidays/countries/ukraine.py index 296aad09e..ff709c6a2 100644 --- a/holidays/countries/ukraine.py +++ b/holidays/countries/ukraine.py @@ -103,9 +103,7 @@ def _populate_common(self, is_martial_law: bool = False): else tr("День перемоги") ) dts_observed.add( - self._add_holiday_may_8(name) - if self._year >= 2024 - else self._add_world_war_two_victory_day(name) + self._add_world_war_two_victory_day(name, is_western=(self._year >= 2024)) ) if self._year >= 1997: diff --git a/holidays/countries/uzbekistan.py b/holidays/countries/uzbekistan.py index 8ee39c096..7fdd9925e 100644 --- a/holidays/countries/uzbekistan.py +++ b/holidays/countries/uzbekistan.py @@ -68,7 +68,8 @@ def _populate_public_holidays(self): tr("Xotira va qadrlash kuni") if self._year >= 1999 # Victory Day. - else tr("G‘alaba kuni") + else tr("G‘alaba kuni"), + is_western=False, ) ) diff --git a/holidays/groups/international.py b/holidays/groups/international.py index 86ee8ee21..87818496d 100644 --- a/holidays/groups/international.py +++ b/holidays/groups/international.py @@ -185,15 +185,18 @@ def _add_womens_day(self, name): """ return self._add_holiday_mar_8(name) - def _add_world_war_two_victory_day(self, name): + def _add_world_war_two_victory_day(self, name, is_western=True): """ - Add Victory Day (May 9th) + Add Day of Victory in World War II in Europe (May 8). + https://en.wikipedia.org/wiki/Victory_in_Europe_Day - Victory Day is a holiday that commemorates the victory over Nazi - Germany in 1945. + Some Eastern European countries celebrate Victory Day on May 9. https://en.wikipedia.org/wiki/Victory_Day_(9_May) """ - return self._add_holiday_may_9(name) + if is_western: + return self._add_holiday_may_8(name) + else: + return self._add_holiday_may_9(name) def _add_united_nations_day(self, name): """ From 208e8e55a6ace4f210d4dd77ae044c0b2d1c737f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 19:04:14 +0300 Subject: [PATCH 22/24] Update pre-commit hooks (#2068) Co-authored-by: arkid15r <2201626+arkid15r@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index be76f1e27..299f35d81 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -54,7 +54,7 @@ repos: exclude: ^(docs) - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.12.0 + rev: v1.12.1 hooks: - id: mypy additional_dependencies: From 17d910ca8471e7f15b322440af95443a1ff0ea99 Mon Sep 17 00:00:00 2001 From: Arkadii Yakovets <2201626+arkid15r@users.noreply.github.com> Date: Mon, 21 Oct 2024 09:28:38 -0700 Subject: [PATCH 23/24] Update metadata Python versions (#2069) --- pyproject.toml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 3706253df..9a77001c8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,9 +17,12 @@ classifiers = [ "Intended Audience :: Information Technology", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", - "Programming Language :: Python", - "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", "Programming Language :: Python :: Implementation :: CPython", "Topic :: File Formats :: JSON", "Topic :: Office/Business :: Financial :: Accounting", From cd6bbeaffb87d60cad97929e14bf465561660c07 Mon Sep 17 00:00:00 2001 From: ~Jhellico Date: Mon, 21 Oct 2024 19:10:53 +0300 Subject: [PATCH 24/24] Finalize v0.59 --- CHANGES | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CHANGES b/CHANGES index d17eb305d..dbc0cee71 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,19 @@ +Version 0.59 +============ + +Released October 21, 2024 + +- Update Vietnam holidays: add `th` localization (#2060 by @PPsyrius) +- Update Germany holidays: add Liberation from Nazi Regime Day 2025 in Berlin (#2052 by @hf-kklein, @PPsyrius) +- Update Johor (Malaysia) and United Arab Emirates `weekend` observance, cleanup others (#2048 by @PPsyrius) +- Update Vietnam holidays (#2049 by @KJhellico) +- Update `InternationalHolidays::_add_world_war_two_victory_day()` method (#2064 by @KJhellico) +- Update `holidays` package metadata (#2063 by @arkid15r) +- Update metadata Python versions (#2069 by @arkid15r) +- Add `EasternCalendarHolidays` to holidays groups (#2062 by @KJhellico) +- Drop Python 3.8 support (#2042 by @PPsyrius) +- Satisfy mypy requirements (#2053 by @arkid15r) + Version 0.58 ============