13
13
from datetime import date
14
14
from gettext import gettext as tr
15
15
16
- from holidays .calendars .gregorian import JAN , FEB , SEP , NOV , THU , FRI , SAT , _timedelta
16
+ from holidays .calendars import _CustomIslamicHolidays
17
+ from holidays .calendars .gregorian import SEP , NOV , THU , FRI , SAT , _timedelta
17
18
from holidays .groups import IslamicHolidays , StaticHolidays
18
19
from holidays .observed_holiday_base import (
19
20
ObservedHolidayBase ,
@@ -30,9 +31,10 @@ class SaudiArabia(ObservedHolidayBase, IslamicHolidays, StaticHolidays):
30
31
"""Saudi Arabia holidays.
31
32
32
33
References:
33
- * <https://laboreducation.hrsd.gov.sa/en/gallery/274 >
34
+ * <https://ar.wikipedia.org/wiki/قائمة_العطل_الرسمية_في_السعودية >
34
35
* <https://web.archive.org/web/20240610223551/http://laboreducation.hrsd.gov.sa/en/labor-education/322>
35
36
* <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>
37
+ * [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)
36
38
"""
37
39
38
40
country = "SA"
@@ -45,26 +47,29 @@ class SaudiArabia(ObservedHolidayBase, IslamicHolidays, StaticHolidays):
45
47
observed_estimated_label = tr ("%s (المقدرة، ملاحظة)" )
46
48
supported_languages = ("ar" , "en_US" )
47
49
48
- def __init__ (self , * args , islamic_show_estimated : bool = True , ** kwargs ):
49
- """
50
+ def __init__ (self , * args , islamic_show_estimated : bool = False , ** kwargs ):
51
+ """Saudi Arabia has traditionally used the Umm al-Qura calendar
52
+ for administrative purposes.
53
+
50
54
Args:
51
55
islamic_show_estimated:
52
56
Whether to add "estimated" label to Islamic holidays name
53
57
if holiday date is estimated.
54
58
"""
55
- IslamicHolidays .__init__ (self , show_estimated = islamic_show_estimated )
59
+ IslamicHolidays .__init__ (
60
+ self , cls = SaudiArabiaIslamicHolidays , show_estimated = islamic_show_estimated
61
+ )
56
62
StaticHolidays .__init__ (self , SaudiArabiaStaticHolidays )
57
63
kwargs .setdefault ("observed_rule" , FRI_TO_PREV_THU + SAT_TO_NEXT_SUN )
58
64
super ().__init__ (* args , ** kwargs )
59
65
60
- def _add_islamic_observed (self , dts : set [ date ] ) -> None :
66
+ def _add_islamic_observed (self , dt : date ) -> None :
61
67
# Observed days are added to make up for any days falling on a weekend.
62
68
if not self .observed :
63
69
return None
64
70
observed_rule = THU_FRI_TO_NEXT_WORKDAY if self ._year <= 2012 else FRI_SAT_TO_NEXT_WORKDAY
65
- for dt in dts :
66
- for i in range (4 ):
67
- self ._add_observed (_timedelta (dt , - i ), name = self [dt ], rule = observed_rule )
71
+ for i in range (4 ):
72
+ self ._add_observed (_timedelta (dt , - i ), name = self [dt ], rule = observed_rule )
68
73
69
74
def _populate_public_holidays (self ):
70
75
# Weekend used to be THU, FRI before June 28th, 2013.
@@ -77,36 +82,38 @@ def _populate_public_holidays(self):
77
82
)
78
83
self .weekend = {THU , FRI } if self ._year <= 2012 else {FRI , SAT }
79
84
80
- # Eid al-Fitr Holiday
85
+ # Eid al-Fitr Holiday.
81
86
eid_al_fitr_name = tr ("عطلة عيد الفطر" )
82
- self ._add_eid_al_fitr_day (eid_al_fitr_name )
87
+ eid_al_fitr_dates = self ._add_eid_al_fitr_day (eid_al_fitr_name )
83
88
self ._add_eid_al_fitr_day_two (eid_al_fitr_name )
84
89
self ._add_eid_al_fitr_day_three (eid_al_fitr_name )
85
- self ._add_islamic_observed (self ._add_eid_al_fitr_day_four (eid_al_fitr_name ))
86
90
87
- # Arafat Day
91
+ for dt in eid_al_fitr_dates :
92
+ if self ._islamic_calendar ._is_long_ramadan (dt ):
93
+ # Add 30 Ramadan.
94
+ self ._add_holiday (eid_al_fitr_name , _timedelta (dt , - 1 ))
95
+ self ._add_islamic_observed (_timedelta (dt , + 2 ))
96
+ else :
97
+ # Add 4 Shawwal.
98
+ self ._add_islamic_observed (self ._add_holiday (eid_al_fitr_name , _timedelta (dt , + 3 )))
99
+
100
+ # Arafat Day.
88
101
self ._add_arafah_day (tr ("يوم عرفة" ))
89
- # Eid al-Adha Holiday
102
+
103
+ # Eid al-Adha Holiday.
90
104
name = tr ("عطلة عيد الأضحى" )
91
105
self ._add_eid_al_adha_day (name )
92
106
self ._add_eid_al_adha_day_two (name )
93
- self ._add_islamic_observed (self ._add_eid_al_adha_day_three (name ))
94
-
95
- # If National Day happens within the Eid al-Fitr Holiday or
96
- # Eid al-Adha Holiday, there is no extra holidays given for it.
97
- if self ._year >= 2005 :
98
- dt = date (self ._year , SEP , 23 )
99
- if dt not in self :
100
- # National Day Holiday
101
- self ._add_observed (self ._add_holiday (tr ("اليوم الوطني" ), dt ))
107
+ for dt in self ._add_eid_al_adha_day_three (name ):
108
+ self ._add_islamic_observed (dt )
102
109
103
- # If Founding Day happens within the Eid al-Fitr Holiday or
104
- # Eid al-Adha Holiday, there is no extra holidays given for it.
105
110
if self ._year >= 2022 :
106
- dt = date (self ._year , FEB , 22 )
107
- if dt not in self :
108
- # Founding Day
109
- self ._add_observed (self ._add_holiday (tr ("يوم التأسيسي" ), dt ))
111
+ # Founding Day.
112
+ self ._add_observed (self ._add_holiday_feb_22 (tr ("يوم التأسيسي" )))
113
+
114
+ if self ._year >= 2005 :
115
+ # National Day.
116
+ self ._add_observed (self ._add_holiday_sep_23 (tr ("اليوم الوطني" )))
110
117
111
118
112
119
class SA (SaudiArabia ):
@@ -117,13 +124,14 @@ class SAU(SaudiArabia):
117
124
pass
118
125
119
126
127
+ class SaudiArabiaIslamicHolidays (_CustomIslamicHolidays ):
128
+ EID_AL_ADHA_DATES = {
129
+ 2015 : (SEP , 24 ),
130
+ }
131
+
132
+
120
133
class SaudiArabiaStaticHolidays :
121
134
special_public_holidays = {
122
- # Celebrate the country's win against Argentina in the World Cup
135
+ # Celebrate the country's win against Argentina in the World Cup.
123
136
2022 : (NOV , 23 , tr ("يوم وطني" )),
124
137
}
125
-
126
- special_public_holidays_observed = {
127
- # Eid al-Fitr Holiday
128
- 2001 : (JAN , 1 , tr ("عطلة عيد الفطر" )),
129
- }
0 commit comments