1030 lines
31 KiB
Python
1030 lines
31 KiB
Python
# holidays
|
|
# --------
|
|
# A fast, efficient Python library for generating country, province and state
|
|
# specific sets of holidays on the fly. It aims to make determining whether a
|
|
# specific date is a holiday as fast and flexible as possible.
|
|
#
|
|
# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
|
|
# dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
|
|
# ryanss <ryanssdev@icloud.com> (c) 2014-2017
|
|
# Website: https://github.com/vacanza/holidays
|
|
# License: MIT (see LICENSE file)
|
|
|
|
from gettext import gettext as tr
|
|
|
|
from holidays.calendars import (
|
|
_CustomBuddhistHolidays,
|
|
_CustomChineseHolidays,
|
|
_CustomHinduHolidays,
|
|
_CustomIslamicHolidays,
|
|
)
|
|
from holidays.calendars.gregorian import (
|
|
JAN,
|
|
FEB,
|
|
MAR,
|
|
APR,
|
|
MAY,
|
|
JUN,
|
|
JUL,
|
|
AUG,
|
|
SEP,
|
|
OCT,
|
|
NOV,
|
|
DEC,
|
|
FRI,
|
|
SAT,
|
|
SUN,
|
|
)
|
|
from holidays.groups import (
|
|
BuddhistCalendarHolidays,
|
|
ChineseCalendarHolidays,
|
|
ChristianHolidays,
|
|
HinduCalendarHolidays,
|
|
InternationalHolidays,
|
|
IslamicHolidays,
|
|
StaticHolidays,
|
|
)
|
|
from holidays.observed_holiday_base import (
|
|
ObservedHolidayBase,
|
|
FRI_TO_NEXT_WORKDAY,
|
|
SAT_TO_NEXT_WORKDAY,
|
|
SUN_TO_NEXT_WORKDAY,
|
|
)
|
|
|
|
|
|
class Malaysia(
|
|
ObservedHolidayBase,
|
|
BuddhistCalendarHolidays,
|
|
ChineseCalendarHolidays,
|
|
ChristianHolidays,
|
|
HinduCalendarHolidays,
|
|
InternationalHolidays,
|
|
IslamicHolidays,
|
|
StaticHolidays,
|
|
):
|
|
"""Malaysia holidays.
|
|
|
|
References:
|
|
* [Holidays Act 1951](https://web.archive.org/web/20241202103403/https://www.kabinet.gov.my/bkpp/pdf/akta_warta/1951_12_31_act369.pdf)
|
|
* [Holidays Ordinance (Sabah Cap. 56)](https://web.archive.org/web/20201028045259/https://sagc.sabah.gov.my/sites/default/files/law/HolidaysOrdinance.pdf)
|
|
* [Public Holidays Ordinance (Sarawak Cap. 8)](https://web.archive.org/web/20221208142318/https://www.kabinet.gov.my/bkpp/pdf/akta_warta/sarawak_public_holidays_ord_chapter8.pdf)
|
|
* [Wikipedia](https://en.wikipedia.org/wiki/Public_holidays_in_Malaysia)
|
|
* <https://web.archive.org/web/20250123115300/https://www.nst.com.my/news/nation/2020/03/571660/agongs-birthday-moved-june-6-june-8>
|
|
* <https://web.archive.org/web/20240228225038/https://www.nst.com.my/news/nation/2024/02/1014012/melaka-cm-suggests-declaring-feb-20-federal-public-holiday-mark>
|
|
|
|
Section 3 of Holidays Act 1951:
|
|
> If any day specified in the Schedule falls on Sunday then the day following shall be
|
|
> a public holiday and if such day is already a public holiday, then the day following
|
|
> shall be a public holiday".
|
|
|
|
In Johor (until 1994 and in 2014-2024) and Kedah it's Friday to Sunday,
|
|
in Kelantan and Terengganu - Saturday to Sunday.
|
|
"""
|
|
|
|
country = "MY"
|
|
default_language = "ms_MY"
|
|
# %s (estimated).
|
|
estimated_label = tr("%s (anggaran)")
|
|
# %s (in lieu).
|
|
observed_label = tr("Cuti %s")
|
|
# %s (observed, estimated).
|
|
observed_estimated_label = tr("Cuti %s (anggaran)")
|
|
start_year = 1952
|
|
subdivisions = (
|
|
"01", # Johor.
|
|
"02", # Kedah.
|
|
"03", # Kelantan.
|
|
"04", # Melaka.
|
|
"05", # Negeri Sembilan.
|
|
"06", # Pahang.
|
|
"07", # Pulau Pinang.
|
|
"08", # Perak.
|
|
"09", # Perlis.
|
|
"10", # Selangor.
|
|
"11", # Terengganu.
|
|
"12", # Sabah.
|
|
"13", # Sarawak.
|
|
"14", # Wilayah Persekutuan Kuala Lumpur.
|
|
"15", # Wilayah Persekutuan Labuan.
|
|
"16", # Wilayah Persekutuan Putrajaya.
|
|
)
|
|
subdivisions_aliases = {
|
|
"Johor": "01",
|
|
"JHR": "01",
|
|
"Kedah": "02",
|
|
"KDH": "02",
|
|
"Kelantan": "03",
|
|
"KTN": "03",
|
|
"Melaka": "04",
|
|
"MLK": "04",
|
|
"Negeri Sembilan": "05",
|
|
"NSN": "05",
|
|
"Pahang": "06",
|
|
"PHG": "06",
|
|
"Pulau Pinang": "07",
|
|
"PNG": "07",
|
|
"Perak": "08",
|
|
"PRK": "08",
|
|
"Perlis": "09",
|
|
"PLS": "09",
|
|
"Selangor": "10",
|
|
"SGR": "10",
|
|
"Terengganu": "11",
|
|
"TRG": "11",
|
|
"Sabah": "12",
|
|
"SBH": "12",
|
|
"Sarawak": "13",
|
|
"SWK": "13",
|
|
"Wilayah Persekutuan Kuala Lumpur": "14",
|
|
"KUL": "14",
|
|
"Wilayah Persekutuan Labuan": "15",
|
|
"LBN": "15",
|
|
"Wilayah Persekutuan Putrajaya": "16",
|
|
"PJY": "16",
|
|
}
|
|
supported_languages = ("en_US", "ms_MY", "th")
|
|
|
|
def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
|
|
"""
|
|
Args:
|
|
islamic_show_estimated:
|
|
Whether to add "estimated" label to Islamic holidays name
|
|
if holiday date is estimated.
|
|
"""
|
|
BuddhistCalendarHolidays.__init__(self, cls=MalaysiaBuddhistHolidays, show_estimated=True)
|
|
ChineseCalendarHolidays.__init__(self, cls=MalaysiaChineseHolidays, show_estimated=True)
|
|
ChristianHolidays.__init__(self)
|
|
HinduCalendarHolidays.__init__(self, cls=MalaysiaHinduHolidays)
|
|
InternationalHolidays.__init__(self)
|
|
IslamicHolidays.__init__(
|
|
self, cls=MalaysiaIslamicHolidays, show_estimated=islamic_show_estimated
|
|
)
|
|
StaticHolidays.__init__(self, cls=MalaysiaStaticHolidays)
|
|
kwargs.setdefault("observed_rule", SUN_TO_NEXT_WORKDAY)
|
|
super().__init__(*args, **kwargs)
|
|
|
|
def _populate_public_holidays(self):
|
|
self.dts_observed = set()
|
|
|
|
# Chinese New Year.
|
|
self.dts_observed.add(self._add_chinese_new_years_day(tr("Tahun Baharu Cina")))
|
|
|
|
self.dts_observed.add(
|
|
# Chinese New Year (Second Day).
|
|
self._add_chinese_new_years_day_two(tr("Tahun Baharu Cina (Hari Kedua)"))
|
|
)
|
|
|
|
# Vesak Day.
|
|
self.dts_observed.add(self._add_vesak_may(tr("Hari Wesak")))
|
|
|
|
if self._year >= 1973:
|
|
# Labor Day.
|
|
self.dts_observed.add(self._add_labor_day(tr("Hari Pekerja")))
|
|
|
|
# Birthday of HM Yang di-Pertuan Agong.
|
|
name = tr("Hari Keputeraan Rasmi Seri Paduka Baginda Yang di-Pertuan Agong")
|
|
if self._year <= 2016:
|
|
self.dts_observed.add(self._add_holiday_1st_sat_of_jun(name))
|
|
elif self._year <= 2019:
|
|
self.dts_observed.add(self._add_holiday_sep_9(name))
|
|
elif self._year == 2020:
|
|
self.dts_observed.add(self._add_holiday_jun_8(name))
|
|
else:
|
|
self.dts_observed.add(self._add_holiday_1st_mon_of_jun(name))
|
|
|
|
# National Day.
|
|
self.dts_observed.add(self._add_holiday_aug_31(tr("Hari Kebangsaan")))
|
|
|
|
if self._year >= 2010:
|
|
# Malaysia Day.
|
|
self.dts_observed.add(self._add_holiday_sep_16(tr("Hari Malaysia")))
|
|
|
|
# Christmas Day.
|
|
self.dts_observed.add(self._add_christmas_day(tr("Hari Krismas")))
|
|
|
|
if self._year >= 1995:
|
|
# Islamic New Year.
|
|
self._add_islamic_new_year_day(tr("Awal Muharam"))
|
|
|
|
# Prophet Muhammad's Birthday.
|
|
self.dts_observed.update(self._add_mawlid_day(tr("Hari Keputeraan Nabi Muhammad S.A.W.")))
|
|
|
|
# Eid al-Fitr.
|
|
self.dts_observed.update(self._add_eid_al_fitr_day(tr("Hari Raya Puasa")))
|
|
|
|
# Eid al-Fitr (Second Day).
|
|
self.dts_observed.update(self._add_eid_al_fitr_day_two(tr("Hari Raya Puasa (Hari Kedua)")))
|
|
|
|
# Eid al-Adha.
|
|
self.dts_observed.update(self._add_eid_al_adha_day(tr("Hari Raya Qurban")))
|
|
|
|
def _populate_subdiv_holidays(self):
|
|
if self.subdiv and self.subdiv not in {"13", "15"}:
|
|
# Deepavali.
|
|
self.dts_observed.add(self._add_diwali(tr("Hari Deepavali")))
|
|
|
|
super()._populate_subdiv_holidays()
|
|
|
|
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)
|
|
|
|
def _populate_subdiv_01_public_holidays(self):
|
|
# Thaipusam.
|
|
self.dts_observed.add(self._add_thaipusam(tr("Hari Thaipusam")))
|
|
|
|
if self._year >= 2015:
|
|
# Birthday of the Sultan of Johor.
|
|
self._add_holiday_mar_23(tr("Hari Keputeraan Sultan Johor"))
|
|
|
|
if self._year >= 2011:
|
|
# The Sultan of Johor Hol.
|
|
self._add_hari_hol_johor(tr("Hari Hol Almarhum Sultan Iskandar"))
|
|
|
|
# Beginning of Ramadan.
|
|
self.dts_observed.update(self._add_ramadan_beginning_day(tr("Awal Ramadan")))
|
|
|
|
def _populate_subdiv_02_public_holidays(self):
|
|
if self._year >= 2022:
|
|
# Thaipusam.
|
|
self.dts_observed.add(self._add_thaipusam(tr("Hari Thaipusam")))
|
|
|
|
if self._year >= 2018:
|
|
# Birthday of The Sultan of Kedah.
|
|
name = tr("Hari Keputeraan Sultan Kedah")
|
|
if self._year == 2024:
|
|
self._add_holiday_jun_30(name)
|
|
else:
|
|
self._add_holiday_3rd_sun_of_jun(name)
|
|
|
|
# Isra' and Mi'raj.
|
|
self.dts_observed.update(self._add_isra_and_miraj_day(tr("Israk dan Mikraj")))
|
|
|
|
# Beginning of Ramadan.
|
|
self.dts_observed.update(self._add_ramadan_beginning_day(tr("Awal Ramadan")))
|
|
|
|
# Eid al-Adha (Second Day).
|
|
self.dts_observed.update(
|
|
self._add_eid_al_adha_day_two(tr("Hari Raya Qurban (Hari Kedua)"))
|
|
)
|
|
|
|
def _populate_subdiv_03_public_holidays(self):
|
|
if self._year >= 2010:
|
|
# Birthday of the Sultan of Kelantan.
|
|
name = tr("Hari Keputeraan Sultan Kelantan")
|
|
if self._year >= 2023:
|
|
self._add_holiday_sep_29(name)
|
|
self._add_holiday_sep_30(name)
|
|
elif self._year >= 2012:
|
|
self._add_holiday_nov_11(name)
|
|
self._add_holiday_nov_12(name)
|
|
else:
|
|
self._add_holiday_mar_30(name)
|
|
self._add_holiday_mar_31(name)
|
|
|
|
# Nuzul Al-Quran Day.
|
|
self.dts_observed.update(self._add_nuzul_al_quran_day(tr("Hari Nuzul Al-Quran")))
|
|
|
|
if self._year >= 2023:
|
|
# Arafat Day.
|
|
self.dts_observed.update(self._add_arafah_day(tr("Hari Arafah")))
|
|
|
|
# Eid al-Adha (Second Day).
|
|
self.dts_observed.update(
|
|
self._add_eid_al_adha_day_two(tr("Hari Raya Qurban (Hari Kedua)"))
|
|
)
|
|
|
|
def _populate_subdiv_04_public_holidays(self):
|
|
# New Year's Day.
|
|
self.dts_observed.add(self._add_new_years_day(tr("Tahun Baharu")))
|
|
|
|
if self._year >= 2024:
|
|
self.dts_observed.add(
|
|
# Declaration of Independence Day.
|
|
self._add_holiday_feb_20(tr("Hari Pengisytiharan Tarikh Kemerdekaan"))
|
|
)
|
|
elif self._year >= 1989:
|
|
self.dts_observed.add(
|
|
self._add_holiday_apr_15(
|
|
# Declaration of Malacca as a Historical City.
|
|
tr("Hari Perisytiharan Melaka Sebagai Bandaraya Bersejarah")
|
|
)
|
|
)
|
|
|
|
# Birthday of the Governor of Malacca.
|
|
name = tr("Hari Jadi Yang di-Pertua Negeri Melaka")
|
|
self.dts_observed.add(
|
|
self._add_holiday_aug_24(name)
|
|
if self._year >= 2020
|
|
else self._add_holiday_2nd_fri_of_oct(name)
|
|
)
|
|
|
|
if self._year >= 2025:
|
|
self.dts_observed.update(
|
|
# Eid al-Fitr (Third Day).
|
|
self._add_eid_al_fitr_day_three(tr("Hari Raya Puasa (Hari Ketiga)"))
|
|
)
|
|
else:
|
|
# Beginning of Ramadan.
|
|
self.dts_observed.update(self._add_ramadan_beginning_day(tr("Awal Ramadan")))
|
|
|
|
def _populate_subdiv_05_public_holidays(self):
|
|
# New Year's Day.
|
|
self.dts_observed.add(self._add_new_years_day(tr("Tahun Baharu")))
|
|
|
|
# Thaipusam.
|
|
self.dts_observed.add(self._add_thaipusam(tr("Hari Thaipusam")))
|
|
|
|
if self._year >= 2009:
|
|
self.dts_observed.add(
|
|
self._add_holiday_jan_14(
|
|
# Birthday of the Sultan of Negeri Sembilan.
|
|
tr("Hari Keputeraan Yang di-Pertuan Besar Negeri Sembilan")
|
|
)
|
|
)
|
|
|
|
# Isra' and Mi'raj.
|
|
self.dts_observed.update(self._add_isra_and_miraj_day(tr("Israk dan Mikraj")))
|
|
|
|
def _populate_subdiv_06_public_holidays(self):
|
|
# New Year's Day.
|
|
self.dts_observed.add(self._add_new_years_day(tr("Tahun Baharu")))
|
|
|
|
if self._year >= 1975:
|
|
# The Sultan of Pahang Hol.
|
|
name = tr("Hari Hol Sultan Pahang")
|
|
self.dts_observed.add(
|
|
self._add_holiday_may_22(name)
|
|
if self._year >= 2020
|
|
else self._add_holiday_may_7(name)
|
|
)
|
|
|
|
# Birthday of the Sultan of Pahang.
|
|
name = tr("Hari Keputeraan Sultan Pahang")
|
|
self.dts_observed.add(
|
|
self._add_holiday_jul_30(name)
|
|
if self._year >= 2019
|
|
else self._add_holiday_oct_24(name)
|
|
)
|
|
|
|
# Nuzul Al-Quran Day.
|
|
self.dts_observed.update(self._add_nuzul_al_quran_day(tr("Hari Nuzul Al-Quran")))
|
|
|
|
def _populate_subdiv_07_public_holidays(self):
|
|
# New Year's Day.
|
|
self.dts_observed.add(self._add_new_years_day(tr("Tahun Baharu")))
|
|
|
|
# Thaipusam.
|
|
self.dts_observed.add(self._add_thaipusam(tr("Hari Thaipusam")))
|
|
|
|
if self._year >= 2009:
|
|
self.dts_observed.add(
|
|
# George Town Heritage Day.
|
|
self._add_holiday_jul_7(tr("Hari Ulang Tahun Perisytiharan Tapak Warisan Dunia"))
|
|
)
|
|
|
|
self.dts_observed.add(
|
|
# Birthday of the Governor of Penang.
|
|
self._add_holiday_2nd_sat_of_jul(tr("Hari Jadi Yang di-Pertua Negeri Pulau Pinang"))
|
|
)
|
|
|
|
# Nuzul Al-Quran Day.
|
|
self.dts_observed.update(self._add_nuzul_al_quran_day(tr("Hari Nuzul Al-Quran")))
|
|
|
|
def _populate_subdiv_08_public_holidays(self):
|
|
# New Year's Day.
|
|
self.dts_observed.add(self._add_new_years_day(tr("Tahun Baharu")))
|
|
|
|
# Thaipusam.
|
|
self.dts_observed.add(self._add_thaipusam(tr("Hari Thaipusam")))
|
|
|
|
# Birthday of the Sultan of Perak.
|
|
name = tr("Hari Keputeraan Sultan Perak")
|
|
if self._year >= 2018:
|
|
self._add_holiday_1st_fri_of_nov(name)
|
|
else:
|
|
self._add_holiday_nov_27(name)
|
|
|
|
# Nuzul Al-Quran Day.
|
|
self.dts_observed.update(self._add_nuzul_al_quran_day(tr("Hari Nuzul Al-Quran")))
|
|
|
|
def _populate_subdiv_09_public_holidays(self):
|
|
if self._year >= 2000:
|
|
# Birthday of the Raja of Perlis.
|
|
name = tr("Hari Ulang Tahun Keputeraan Raja Perlis")
|
|
self.dts_observed.add(
|
|
self._add_holiday_jul_17(name)
|
|
if 2018 <= self._year <= 2021
|
|
else self._add_holiday_may_17(name)
|
|
)
|
|
|
|
# Isra' and Mi'raj.
|
|
self.dts_observed.update(self._add_isra_and_miraj_day(tr("Israk dan Mikraj")))
|
|
|
|
# Nuzul Al-Quran Day.
|
|
self.dts_observed.update(self._add_nuzul_al_quran_day(tr("Hari Nuzul Al-Quran")))
|
|
|
|
# Eid al-Adha (Second Day).
|
|
self.dts_observed.update(
|
|
self._add_eid_al_adha_day_two(tr("Hari Raya Qurban (Hari Kedua)"))
|
|
)
|
|
|
|
def _populate_subdiv_10_public_holidays(self):
|
|
# New Year's Day.
|
|
self.dts_observed.add(self._add_new_years_day(tr("Tahun Baharu")))
|
|
|
|
# Thaipusam.
|
|
self.dts_observed.add(self._add_thaipusam(tr("Hari Thaipusam")))
|
|
|
|
# Birthday of The Sultan of Selangor.
|
|
self.dts_observed.add(self._add_holiday_dec_11(tr("Hari Keputeraan Sultan Selangor")))
|
|
|
|
# Nuzul Al-Quran Day.
|
|
self.dts_observed.update(self._add_nuzul_al_quran_day(tr("Hari Nuzul Al-Quran")))
|
|
|
|
def _populate_subdiv_11_public_holidays(self):
|
|
if self._year >= 2000:
|
|
self.dts_observed.add(
|
|
self._add_holiday_mar_4(
|
|
# Anniversary of the Installation of the Sultan of Terengganu.
|
|
tr("Hari Ulang Tahun Pertabalan Sultan Terengganu")
|
|
)
|
|
)
|
|
|
|
self.dts_observed.add(
|
|
# Birthday of the Sultan of Terengganu.
|
|
self._add_holiday_apr_26(tr("Hari Keputeraan Sultan Terengganu"))
|
|
)
|
|
|
|
if self._year >= 2020:
|
|
# Isra' and Mi'raj.
|
|
self.dts_observed.update(self._add_isra_and_miraj_day(tr("Israk dan Mikraj")))
|
|
|
|
# Nuzul Al-Quran Day.
|
|
self.dts_observed.update(self._add_nuzul_al_quran_day(tr("Hari Nuzul Al-Quran")))
|
|
|
|
# Arafat Day.
|
|
self.dts_observed.update(self._add_arafah_day(tr("Hari Arafah")))
|
|
|
|
self.dts_observed.update(
|
|
# Eid al-Adha (Second Day).
|
|
self._add_eid_al_adha_day_two(tr("Hari Raya Qurban (Hari Kedua)"))
|
|
)
|
|
|
|
def _populate_subdiv_12_public_holidays(self):
|
|
# New Year's Day.
|
|
self.dts_observed.add(self._add_new_years_day(tr("Tahun Baharu")))
|
|
|
|
# Good Friday.
|
|
self._add_good_friday(tr("Good Friday"))
|
|
|
|
# Pesta Kaamatan.
|
|
name = tr("Pesta Kaamatan")
|
|
self._add_holiday_may_30(name)
|
|
self._add_holiday_may_31(name)
|
|
|
|
# Birthday of the Governor of Sabah.
|
|
self._add_holiday_1st_sat_of_oct(tr("Hari Jadi Yang di-Pertua Negeri Sabah"))
|
|
|
|
if self._year >= 2019:
|
|
# Christmas Eve.
|
|
self._add_christmas_eve(tr("Christmas Eve"))
|
|
|
|
def _populate_subdiv_13_public_holidays(self):
|
|
# New Year's Day.
|
|
self.dts_observed.add(self._add_new_years_day(tr("Tahun Baharu")))
|
|
|
|
# Good Friday.
|
|
self._add_good_friday(tr("Good Friday"))
|
|
|
|
if self._year >= 1965:
|
|
# Dayak Festival Day.
|
|
name = tr("Perayaan Hari Gawai Dayak")
|
|
self.dts_observed.add(self._add_holiday_jun_1(name))
|
|
self.dts_observed.add(self._add_holiday_jun_2(name))
|
|
|
|
# Birthday of the Governor of Sarawak.
|
|
self._add_holiday_2nd_sat_of_oct(tr("Hari Jadi Yang di-Pertua Negeri Sarawak"))
|
|
|
|
if self._year >= 2017:
|
|
# Sarawak Independence Day.
|
|
self.dts_observed.add(self._add_holiday_jul_22(tr("Hari Kemerdekaan Sarawak")))
|
|
|
|
def _populate_subdiv_14_public_holidays(self):
|
|
# New Year's Day.
|
|
self.dts_observed.add(self._add_new_years_day(tr("Tahun Baharu")))
|
|
|
|
# Thaipusam.
|
|
self.dts_observed.add(self._add_thaipusam(tr("Hari Thaipusam")))
|
|
|
|
if self._year >= 1974:
|
|
# Federal Territory Day.
|
|
self.dts_observed.add(self._add_holiday_feb_1(tr("Hari Wilayah Persekutuan")))
|
|
|
|
# Nuzul Al-Quran Day.
|
|
self.dts_observed.update(self._add_nuzul_al_quran_day(tr("Hari Nuzul Al-Quran")))
|
|
|
|
def _populate_subdiv_15_public_holidays(self):
|
|
# New Year's Day.
|
|
self.dts_observed.add(self._add_new_years_day(tr("Tahun Baharu")))
|
|
|
|
if self._year >= 1974:
|
|
# Federal Territory Day.
|
|
self.dts_observed.add(self._add_holiday_feb_1(tr("Hari Wilayah Persekutuan")))
|
|
|
|
# Pesta Kaamatan.
|
|
name = tr("Pesta Kaamatan")
|
|
self._add_holiday_may_30(name)
|
|
self._add_holiday_may_31(name)
|
|
|
|
if self._year >= 2014:
|
|
# Deepavali.
|
|
self.dts_observed.add(self._add_diwali(tr("Hari Deepavali")))
|
|
|
|
# Nuzul Al-Quran Day.
|
|
self.dts_observed.update(self._add_nuzul_al_quran_day(tr("Hari Nuzul Al-Quran")))
|
|
|
|
def _populate_subdiv_16_public_holidays(self):
|
|
# New Year's Day.
|
|
self.dts_observed.add(self._add_new_years_day(tr("Tahun Baharu")))
|
|
|
|
# Thaipusam.
|
|
self.dts_observed.add(self._add_thaipusam(tr("Hari Thaipusam")))
|
|
|
|
if self._year >= 1974:
|
|
# Federal Territory Day.
|
|
self.dts_observed.add(self._add_holiday_feb_1(tr("Hari Wilayah Persekutuan")))
|
|
|
|
# Nuzul Al-Quran Day.
|
|
self.dts_observed.update(self._add_nuzul_al_quran_day(tr("Hari Nuzul Al-Quran")))
|
|
|
|
|
|
class MY(Malaysia):
|
|
pass
|
|
|
|
|
|
class MYS(Malaysia):
|
|
pass
|
|
|
|
|
|
class MalaysiaBuddhistHolidays(_CustomBuddhistHolidays):
|
|
VESAK_MAY_DATES = {
|
|
2001: (MAY, 7),
|
|
2002: (MAY, 27),
|
|
2003: (MAY, 15),
|
|
2004: (MAY, 3),
|
|
2005: (MAY, 22),
|
|
2006: (MAY, 12),
|
|
2007: (MAY, 1),
|
|
2008: (MAY, 19),
|
|
2009: (MAY, 9),
|
|
2010: (MAY, 28),
|
|
2011: (MAY, 17),
|
|
2012: (MAY, 5),
|
|
2013: (MAY, 24),
|
|
2014: (MAY, 13),
|
|
2015: (MAY, 3),
|
|
2016: (MAY, 21),
|
|
2017: (MAY, 10),
|
|
2018: (MAY, 29),
|
|
2019: (MAY, 19),
|
|
2020: (MAY, 7),
|
|
2021: (MAY, 26),
|
|
2022: (MAY, 15),
|
|
2023: (MAY, 4),
|
|
2024: (MAY, 22),
|
|
2025: (MAY, 12),
|
|
}
|
|
|
|
|
|
class MalaysiaChineseHolidays(_CustomChineseHolidays):
|
|
LUNAR_NEW_YEAR_DATES = {
|
|
2001: (JAN, 24),
|
|
2002: (FEB, 12),
|
|
2003: (FEB, 1),
|
|
2004: (JAN, 22),
|
|
2005: (FEB, 9),
|
|
2006: (JAN, 29),
|
|
2007: (FEB, 18),
|
|
2008: (FEB, 7),
|
|
2009: (JAN, 26),
|
|
2010: (FEB, 14),
|
|
2011: (FEB, 3),
|
|
2012: (JAN, 23),
|
|
2013: (FEB, 10),
|
|
2014: (JAN, 31),
|
|
2015: (FEB, 19),
|
|
2016: (FEB, 8),
|
|
2017: (JAN, 28),
|
|
2018: (FEB, 16),
|
|
2019: (FEB, 5),
|
|
2020: (JAN, 25),
|
|
2021: (FEB, 12),
|
|
2022: (FEB, 1),
|
|
2023: (JAN, 22),
|
|
2024: (FEB, 10),
|
|
2025: (JAN, 29),
|
|
}
|
|
|
|
|
|
class MalaysiaHinduHolidays(_CustomHinduHolidays):
|
|
DIWALI_DATES = {
|
|
2001: (NOV, 14),
|
|
2002: (NOV, 3),
|
|
2003: (OCT, 23),
|
|
2004: (NOV, 11),
|
|
2005: (NOV, 1),
|
|
2006: (OCT, 21),
|
|
2007: (NOV, 8),
|
|
2008: (OCT, 27),
|
|
2009: (OCT, 17),
|
|
2010: (NOV, 5),
|
|
2011: (OCT, 26),
|
|
2012: (NOV, 13),
|
|
2013: (NOV, 2),
|
|
2014: (OCT, 22),
|
|
2015: (NOV, 10),
|
|
2016: (OCT, 29),
|
|
2017: (OCT, 18),
|
|
2018: (NOV, 6),
|
|
2019: (OCT, 27),
|
|
2020: (NOV, 14),
|
|
2021: (NOV, 4),
|
|
2022: (OCT, 24),
|
|
2023: (NOV, 12),
|
|
2024: (OCT, 31),
|
|
2025: (OCT, 20),
|
|
}
|
|
|
|
THAIPUSAM_DATES = {
|
|
2018: (JAN, 31),
|
|
2019: (JAN, 21),
|
|
2020: (FEB, 8),
|
|
2021: (JAN, 28),
|
|
2022: (JAN, 18),
|
|
2023: (FEB, 5),
|
|
2024: (JAN, 25),
|
|
2025: (FEB, 11),
|
|
2026: (FEB, 1),
|
|
2027: (JAN, 22),
|
|
}
|
|
|
|
|
|
class MalaysiaIslamicHolidays(_CustomIslamicHolidays):
|
|
EID_AL_ADHA_DATES = {
|
|
2001: (MAR, 6),
|
|
2002: (FEB, 23),
|
|
2003: (FEB, 12),
|
|
2004: (FEB, 2),
|
|
2005: (JAN, 21),
|
|
2006: ((JAN, 10), (DEC, 31)),
|
|
2007: (DEC, 20),
|
|
2008: (DEC, 9),
|
|
2009: (NOV, 28),
|
|
2010: (NOV, 17),
|
|
2011: (NOV, 7),
|
|
2012: (OCT, 26),
|
|
2013: (OCT, 15),
|
|
2014: (OCT, 5),
|
|
2015: (SEP, 24),
|
|
2016: (SEP, 12),
|
|
2017: (SEP, 1),
|
|
2018: (AUG, 22),
|
|
2019: (AUG, 11),
|
|
2020: (JUL, 31),
|
|
2021: (JUL, 20),
|
|
2022: (JUL, 10),
|
|
2023: (JUN, 29),
|
|
2024: (JUN, 17),
|
|
2025: (JUN, 7),
|
|
}
|
|
|
|
EID_AL_FITR_DATES = {
|
|
2001: (DEC, 17),
|
|
2002: (DEC, 6),
|
|
2003: (NOV, 26),
|
|
2004: (NOV, 14),
|
|
2005: (NOV, 3),
|
|
2006: (OCT, 24),
|
|
2007: (OCT, 13),
|
|
2008: (OCT, 1),
|
|
2009: (SEP, 20),
|
|
2010: (SEP, 10),
|
|
2011: (AUG, 31),
|
|
2012: (AUG, 19),
|
|
2013: (AUG, 8),
|
|
2014: (JUL, 28),
|
|
2015: (JUL, 17),
|
|
2016: (JUL, 6),
|
|
2017: (JUN, 25),
|
|
2018: (JUN, 15),
|
|
2019: (JUN, 5),
|
|
2020: (MAY, 24),
|
|
2021: (MAY, 13),
|
|
2022: (MAY, 2),
|
|
2023: (APR, 22),
|
|
2024: (APR, 10),
|
|
2025: (MAR, 31),
|
|
}
|
|
|
|
HARI_HOL_JOHOR_DATES = {
|
|
2011: (JAN, 12),
|
|
2012: (DEC, 20),
|
|
2013: (DEC, 10),
|
|
2014: (NOV, 29),
|
|
2015: (NOV, 19),
|
|
2016: (NOV, 7),
|
|
2017: (OCT, 27),
|
|
2018: (OCT, 15),
|
|
2019: (OCT, 5),
|
|
2020: (SEP, 24),
|
|
2021: (SEP, 13),
|
|
2022: (SEP, 3),
|
|
2023: (AUG, 23),
|
|
2024: (AUG, 11),
|
|
2025: (JUL, 31),
|
|
}
|
|
|
|
HIJRI_NEW_YEAR_DATES = {
|
|
2001: (MAR, 26),
|
|
2002: (MAR, 15),
|
|
2003: (MAR, 5),
|
|
2004: (FEB, 22),
|
|
2005: (FEB, 10),
|
|
2006: (JAN, 31),
|
|
2007: (JAN, 20),
|
|
2008: ((JAN, 10), (DEC, 29)),
|
|
2009: (DEC, 18),
|
|
2010: (DEC, 8),
|
|
2011: (NOV, 27),
|
|
2012: (NOV, 15),
|
|
2013: (NOV, 5),
|
|
2014: (OCT, 25),
|
|
2015: (OCT, 14),
|
|
2016: (OCT, 2),
|
|
2017: (SEP, 22),
|
|
2018: (SEP, 11),
|
|
2019: (SEP, 1),
|
|
2020: (AUG, 20),
|
|
2021: (AUG, 10),
|
|
2022: (JUL, 30),
|
|
2023: (JUL, 19),
|
|
2024: (JUL, 7),
|
|
2025: (JUN, 27),
|
|
}
|
|
|
|
ISRA_AND_MIRAJ_DATES = {
|
|
2001: (OCT, 15),
|
|
2002: (OCT, 4),
|
|
2003: (SEP, 24),
|
|
2004: (SEP, 12),
|
|
2005: (SEP, 1),
|
|
2006: (AUG, 22),
|
|
2007: (AUG, 11),
|
|
2008: (JUL, 31),
|
|
2009: (JUL, 20),
|
|
2010: (JUL, 9),
|
|
2011: (JUN, 29),
|
|
2012: (JUN, 17),
|
|
2013: (JUN, 6),
|
|
2014: (MAY, 27),
|
|
2015: (MAY, 16),
|
|
2016: (MAY, 5),
|
|
2017: (APR, 24),
|
|
2018: (APR, 14),
|
|
2019: (APR, 3),
|
|
2020: (MAR, 22),
|
|
2021: (MAR, 11),
|
|
2022: (MAR, 1),
|
|
2023: (FEB, 18),
|
|
2024: (FEB, 8),
|
|
2025: (JAN, 27),
|
|
}
|
|
|
|
MAWLID_DATES = {
|
|
2001: (JUN, 4),
|
|
2002: (MAY, 24),
|
|
2003: (MAY, 14),
|
|
2004: (MAY, 2),
|
|
2005: (APR, 21),
|
|
2006: (APR, 11),
|
|
2007: (MAR, 31),
|
|
2008: (MAR, 20),
|
|
2009: (MAR, 9),
|
|
2010: (FEB, 26),
|
|
2011: (FEB, 16),
|
|
2012: (FEB, 5),
|
|
2013: (JAN, 24),
|
|
2014: (JAN, 14),
|
|
2015: ((JAN, 3), (DEC, 24)),
|
|
2016: (DEC, 12),
|
|
2017: (DEC, 1),
|
|
2018: (NOV, 20),
|
|
2019: (NOV, 9),
|
|
2020: (OCT, 29),
|
|
2021: (OCT, 19),
|
|
2022: (OCT, 10),
|
|
2023: (SEP, 28),
|
|
2024: (SEP, 16),
|
|
2025: (SEP, 5),
|
|
}
|
|
|
|
NUZUL_AL_QURAN_DATES = {
|
|
2001: (DEC, 3),
|
|
2002: (NOV, 22),
|
|
2003: (NOV, 12),
|
|
2004: (NOV, 1),
|
|
2005: (OCT, 21),
|
|
2006: (OCT, 10),
|
|
2007: (SEP, 29),
|
|
2008: (SEP, 18),
|
|
2009: (SEP, 7),
|
|
2010: (AUG, 27),
|
|
2011: (AUG, 17),
|
|
2012: (AUG, 5),
|
|
2013: (JUL, 25),
|
|
2014: (JUL, 15),
|
|
2015: (JUL, 4),
|
|
2016: (JUN, 22),
|
|
2017: (JUN, 12),
|
|
2018: (JUN, 2),
|
|
2019: (MAY, 22),
|
|
2020: (MAY, 10),
|
|
2021: (APR, 29),
|
|
2022: (APR, 19),
|
|
2023: (APR, 8),
|
|
2024: (MAR, 28),
|
|
2025: (MAR, 18),
|
|
}
|
|
|
|
RAMADAN_BEGINNING_DATES = {
|
|
2001: (NOV, 17),
|
|
2002: (NOV, 6),
|
|
2003: (OCT, 27),
|
|
2004: (OCT, 16),
|
|
2005: (OCT, 5),
|
|
2006: (SEP, 24),
|
|
2007: (SEP, 13),
|
|
2008: (SEP, 2),
|
|
2009: (AUG, 22),
|
|
2010: (AUG, 11),
|
|
2011: (AUG, 1),
|
|
2012: (JUL, 20),
|
|
2013: (JUL, 9),
|
|
2014: (JUN, 29),
|
|
2015: (JUN, 18),
|
|
2016: (JUN, 7),
|
|
2017: (MAY, 27),
|
|
2018: (MAY, 17),
|
|
2019: (MAY, 6),
|
|
2020: (APR, 24),
|
|
2021: (APR, 13),
|
|
2022: (APR, 3),
|
|
2023: (MAR, 23),
|
|
2024: (MAR, 12),
|
|
2025: (MAR, 2),
|
|
}
|
|
|
|
|
|
class MalaysiaStaticHolidays:
|
|
# General election additional holiday.
|
|
election_polling_day = tr("Cuti Peristiwa (pilihan raya umum)")
|
|
|
|
# Additional holiday.
|
|
election_additional_holiday = "Cuti Peristiwa"
|
|
|
|
# Eid al-Adha.
|
|
eid_al_adha = tr("Hari Raya Qurban")
|
|
|
|
# Labor Day.
|
|
labor_day = tr("Hari Pekerja")
|
|
|
|
# Malaysia Cup Holiday.
|
|
malaysia_cup_holiday = tr("Cuti Piala Malaysia")
|
|
|
|
# Day of Installation of the 15th Yang di-Pertuan Agong.
|
|
yang_di_pertuan_agong_15_installation = tr("Hari Pertabalan Yang di-Pertuan Agong ke-15")
|
|
|
|
# Day of Installation of the 16th Yang di-Pertuan Agong.
|
|
yang_di_pertuan_agong_16_installation = tr("Hari Pertabalan Yang di-Pertuan Agong ke-16")
|
|
|
|
# Eid al-Fitr (additional holiday).
|
|
eid_al_fitr_additional_holiday = tr("Hari Raya Puasa (pergantian hari)")
|
|
|
|
# Arafat Day.
|
|
arafat_day = tr("Hari Arafah")
|
|
|
|
# Additional holiday in commemoration of the 2017 SEA Games.
|
|
additional_holiday_2017_sea_games = tr("Cuti tambahan sempena memperingati SAT 2017")
|
|
|
|
special_public_holidays = {
|
|
1999: (NOV, 29, election_polling_day),
|
|
2017: (
|
|
(APR, 24, yang_di_pertuan_agong_15_installation),
|
|
(SEP, 4, additional_holiday_2017_sea_games),
|
|
),
|
|
2018: (MAY, 9, election_polling_day),
|
|
2019: (JUL, 30, yang_di_pertuan_agong_16_installation),
|
|
2022: (
|
|
(NOV, 18, election_polling_day),
|
|
(NOV, 19, election_polling_day),
|
|
(NOV, 28, election_additional_holiday),
|
|
),
|
|
2023: (APR, 21, eid_al_fitr_additional_holiday),
|
|
}
|
|
|
|
special_14_public_holidays = {
|
|
2021: (DEC, 3, malaysia_cup_holiday),
|
|
}
|
|
|
|
special_15_public_holidays = {
|
|
2021: (DEC, 3, malaysia_cup_holiday),
|
|
}
|
|
|
|
special_16_public_holidays = {
|
|
2021: (DEC, 3, malaysia_cup_holiday),
|
|
}
|
|
|
|
special_13_public_holidays = {
|
|
2018: (
|
|
(MAY, 17, election_additional_holiday),
|
|
(MAY, 18, election_additional_holiday),
|
|
),
|
|
}
|
|
|
|
special_01_public_holidays_observed = {
|
|
2022: (MAY, 4, labor_day),
|
|
}
|
|
|
|
special_02_public_holidays_observed = {
|
|
2022: (MAY, 4, labor_day),
|
|
}
|
|
|
|
special_03_public_holidays_observed = {
|
|
2022: (MAY, 4, labor_day),
|
|
}
|
|
|
|
special_14_public_holidays_observed = {
|
|
2007: (JAN, 2, eid_al_adha),
|
|
}
|
|
|
|
special_15_public_holidays_observed = {
|
|
2007: (JAN, 2, eid_al_adha),
|
|
}
|
|
|
|
special_04_public_holidays_observed = {
|
|
2007: (JAN, 2, eid_al_adha),
|
|
}
|
|
|
|
special_05_public_holidays_observed = {
|
|
2007: (JAN, 2, eid_al_adha),
|
|
}
|
|
|
|
special_06_public_holidays_observed = {
|
|
2007: (JAN, 2, eid_al_adha),
|
|
}
|
|
|
|
special_16_public_holidays_observed = {
|
|
2007: (JAN, 2, eid_al_adha),
|
|
}
|
|
|
|
special_09_public_holidays_observed = {
|
|
2007: (JAN, 2, eid_al_adha),
|
|
}
|
|
|
|
special_07_public_holidays_observed = {
|
|
2007: (JAN, 2, eid_al_adha),
|
|
}
|
|
|
|
special_08_public_holidays_observed = {
|
|
2007: (JAN, 2, eid_al_adha),
|
|
}
|
|
|
|
special_12_public_holidays_observed = {
|
|
2007: (JAN, 2, eid_al_adha),
|
|
}
|
|
|
|
special_10_public_holidays_observed = {
|
|
2007: (JAN, 2, eid_al_adha),
|
|
}
|
|
|
|
special_13_public_holidays_observed = {
|
|
2007: (JAN, 2, eid_al_adha),
|
|
}
|
|
|
|
special_11_public_holidays_observed = {
|
|
2007: (JAN, 2, arafat_day),
|
|
2022: (MAY, 4, labor_day),
|
|
}
|