+
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 32 additions & 1 deletion holidays/calendars/islamic.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,21 @@
from datetime import date

from holidays.calendars.custom import _CustomCalendar
from holidays.calendars.gregorian import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
from holidays.calendars.gregorian import (
JAN,
FEB,
MAR,
APR,
MAY,
JUN,
JUL,
AUG,
SEP,
OCT,
NOV,
DEC,
_timedelta,
)
from holidays.helpers import _normalize_tuple

ALI_AL_RIDA_DEATH = "ALI_AL_RIDA_DEATH"
Expand Down Expand Up @@ -3963,6 +3977,23 @@ def _get_holiday(self, holiday: str, year: int) -> Iterable[tuple[date, bool]]:
for dt in _normalize_tuple(exact_dates.get(year, estimated_dates.get(year, ()))):
yield date(year, *dt), year not in exact_dates

def _is_long_ramadan(self, eid_al_fitr: date) -> bool:
"""Check whether the Ramadan preceding the given Eid al-Fitr date lasted 30 days.

Args:
eid_al_fitr:
The date of Eid al-Fitr.

Returns:
True if Ramadan lasted 30 days, False otherwise.
"""
eid_al_fitr_year = eid_al_fitr.year
return _timedelta(eid_al_fitr, -30) in {
dt
for year in (eid_al_fitr_year - 1, eid_al_fitr_year)
for (dt, _) in self.ramadan_beginning_dates(year)
}

def ali_al_rida_death_dates(self, year: int) -> Iterable[tuple[date, bool]]:
return self._get_holiday(ALI_AL_RIDA_DEATH, year)

Expand Down
78 changes: 43 additions & 35 deletions holidays/countries/saudi_arabia.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
from datetime import date
from gettext import gettext as tr

from holidays.calendars.gregorian import JAN, FEB, SEP, NOV, THU, FRI, SAT, _timedelta
from holidays.calendars import _CustomIslamicHolidays
from holidays.calendars.gregorian import SEP, NOV, THU, FRI, SAT, _timedelta
from holidays.groups import IslamicHolidays, StaticHolidays
from holidays.observed_holiday_base import (
ObservedHolidayBase,
Expand All @@ -30,9 +31,10 @@ class SaudiArabia(ObservedHolidayBase, IslamicHolidays, StaticHolidays):
"""Saudi Arabia holidays.

References:
* <https://laboreducation.hrsd.gov.sa/en/gallery/274>
* <https://ar.wikipedia.org/wiki/قائمة_العطل_الرسمية_في_السعودية>
* <https://web.archive.org/web/20240610223551/http://laboreducation.hrsd.gov.sa/en/labor-education/322>
* <https://web.archive.org/web/20250329052253/https://english.alarabiya.net/News/gulf/2022/01/27/Saudi-Arabia-to-commemorate-Founding-Day-on-Feb-22-annually-Royal-order>
* [2015 (1436 AH) Dhu al-Hijjah begin on September 15](https://web.archive.org/web/20250430191246/https://qna.org.qa/en/news/news-details?id=saudi-arabia-eid-aladha-to-start-on-september-24&date=14/09/2015)
"""

country = "SA"
Expand All @@ -45,26 +47,29 @@ class SaudiArabia(ObservedHolidayBase, IslamicHolidays, StaticHolidays):
observed_estimated_label = tr("%s (المقدرة، ملاحظة)")
supported_languages = ("ar", "en_US")

def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
"""
def __init__(self, *args, islamic_show_estimated: bool = False, **kwargs):
"""Saudi Arabia has traditionally used the Umm al-Qura calendar
for administrative purposes.

Args:
islamic_show_estimated:
Whether to add "estimated" label to Islamic holidays name
if holiday date is estimated.
"""
IslamicHolidays.__init__(self, show_estimated=islamic_show_estimated)
IslamicHolidays.__init__(
self, cls=SaudiArabiaIslamicHolidays, show_estimated=islamic_show_estimated
)
StaticHolidays.__init__(self, SaudiArabiaStaticHolidays)
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, dt: date) -> None:
# Observed days are added to make up for any days falling on a weekend.
if not self.observed:
return None
observed_rule = THU_FRI_TO_NEXT_WORKDAY if self._year <= 2012 else FRI_SAT_TO_NEXT_WORKDAY
for dt in dts:
for i in range(4):
self._add_observed(_timedelta(dt, -i), name=self[dt], rule=observed_rule)
for i in range(4):
self._add_observed(_timedelta(dt, -i), name=self[dt], rule=observed_rule)

def _populate_public_holidays(self):
# Weekend used to be THU, FRI before June 28th, 2013.
Expand All @@ -77,36 +82,38 @@ def _populate_public_holidays(self):
)
self.weekend = {THU, FRI} if self._year <= 2012 else {FRI, SAT}

# Eid al-Fitr Holiday
# Eid al-Fitr Holiday.
eid_al_fitr_name = tr("عطلة عيد الفطر")
self._add_eid_al_fitr_day(eid_al_fitr_name)
eid_al_fitr_dates = self._add_eid_al_fitr_day(eid_al_fitr_name)
self._add_eid_al_fitr_day_two(eid_al_fitr_name)
self._add_eid_al_fitr_day_three(eid_al_fitr_name)
self._add_islamic_observed(self._add_eid_al_fitr_day_four(eid_al_fitr_name))

# Arafat Day
for dt in eid_al_fitr_dates:
if self._islamic_calendar._is_long_ramadan(dt):
# Add 30 Ramadan.
self._add_holiday(eid_al_fitr_name, _timedelta(dt, -1))
self._add_islamic_observed(_timedelta(dt, +2))
else:
# Add 4 Shawwal.
self._add_islamic_observed(self._add_holiday(eid_al_fitr_name, _timedelta(dt, +3)))

# Arafat Day.
self._add_arafah_day(tr("يوم عرفة"))
# Eid al-Adha Holiday

# Eid al-Adha Holiday.
name = tr("عطلة عيد الأضحى")
self._add_eid_al_adha_day(name)
self._add_eid_al_adha_day_two(name)
self._add_islamic_observed(self._add_eid_al_adha_day_three(name))

# If National Day happens within the Eid al-Fitr Holiday or
# Eid al-Adha Holiday, there is no extra holidays given for it.
if self._year >= 2005:
dt = date(self._year, SEP, 23)
if dt not in self:
# National Day Holiday
self._add_observed(self._add_holiday(tr("اليوم الوطني"), dt))
for dt in self._add_eid_al_adha_day_three(name):
self._add_islamic_observed(dt)

# If Founding Day happens within the Eid al-Fitr Holiday or
# Eid al-Adha Holiday, there is no extra holidays given for it.
if self._year >= 2022:
dt = date(self._year, FEB, 22)
if dt not in self:
# Founding Day
self._add_observed(self._add_holiday(tr("يوم التأسيسي"), dt))
# Founding Day.
self._add_observed(self._add_holiday_feb_22(tr("يوم التأسيسي")))

if self._year >= 2005:
# National Day.
self._add_observed(self._add_holiday_sep_23(tr("اليوم الوطني")))


class SA(SaudiArabia):
Expand All @@ -117,13 +124,14 @@ class SAU(SaudiArabia):
pass


class SaudiArabiaIslamicHolidays(_CustomIslamicHolidays):
EID_AL_ADHA_DATES = {
2015: (SEP, 24),
}


class SaudiArabiaStaticHolidays:
special_public_holidays = {
# Celebrate the country's win against Argentina in the World Cup
# Celebrate the country's win against Argentina in the World Cup.
2022: (NOV, 23, tr("يوم وطني")),
}

special_public_holidays_observed = {
# Eid al-Fitr Holiday
2001: (JAN, 1, tr("عطلة عيد الفطر")),
}
10 changes: 0 additions & 10 deletions holidays/groups/islamic.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,16 +182,6 @@ 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]:
"""
Add Eid al-Fitr Day Four.

https://en.wikipedia.org/wiki/Eid_al-Fitr
"""
return self._add_islamic_calendar_holiday(
name, self._islamic_calendar.eid_al_fitr_dates(self._year), days_delta=+3
)

def _add_eid_al_fitr_eve(self, name) -> set[date]:
"""
Add Eid al-Fitr Eve (last day of 9th month of Islamic calendar).
Expand Down
16 changes: 8 additions & 8 deletions holidays/locale/ar/LC_MESSAGES/SA.po
Original file line number Diff line number Diff line change
Expand Up @@ -42,26 +42,26 @@ msgstr ""
msgid "%s (المقدرة، ملاحظة)"
msgstr ""

#. Eid al-Fitr Holiday
#. Eid al-Fitr Holiday.
msgid "عطلة عيد الفطر"
msgstr ""

#. Arafat Day
#. Arafat Day.
msgid "يوم عرفة"
msgstr ""

#. Eid al-Adha Holiday
#. Eid al-Adha Holiday.
msgid "عطلة عيد الأضحى"
msgstr ""

#. National Day Holiday
msgid "اليوم الوطني"
#. Founding Day.
msgid "يوم التأسيسي"
msgstr ""

#. Founding Day
msgid "يوم التأسيسي"
#. National Day.
msgid "اليوم الوطني"
msgstr ""

#. Celebrate the country's win against Argentina in the World Cup
#. Celebrate the country's win against Argentina in the World Cup.
msgid "يوم وطني"
msgstr ""
18 changes: 9 additions & 9 deletions holidays/locale/en_US/LC_MESSAGES/SA.po
Original file line number Diff line number Diff line change
Expand Up @@ -42,26 +42,26 @@ msgstr "%s (observed)"
msgid "%s (المقدرة، ملاحظة)"
msgstr "%s (observed, estimated)"

#. Eid al-Fitr Holiday
#. Eid al-Fitr Holiday.
msgid "عطلة عيد الفطر"
msgstr "Eid al-Fitr Holiday"

#. Arafat Day
#. Arafat Day.
msgid "يوم عرفة"
msgstr "Arafat Day"

#. Eid al-Adha Holiday
#. Eid al-Adha Holiday.
msgid "عطلة عيد الأضحى"
msgstr "Eid al-Adha Holiday"

#. National Day Holiday
msgid "اليوم الوطني"
msgstr "National Day Holiday"

#. Founding Day
#. Founding Day.
msgid "يوم التأسيسي"
msgstr "Founding Day Holiday"

#. Celebrate the country's win against Argentina in the World Cup
#. National Day.
msgid "اليوم الوطني"
msgstr "National Day Holiday"

#. Celebrate the country's win against Argentina in the World Cup.
msgid "يوم وطني"
msgstr "A National Day"
Loading
Loading
点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载