holidays 0.25__py3-none-any.whl → 0.27__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. holidays/__init__.py +1 -1
  2. holidays/calendars/__init__.py +9 -7
  3. holidays/calendars/buddhist.py +445 -0
  4. holidays/calendars/chinese.py +1238 -431
  5. holidays/calendars/custom.py +1 -3
  6. holidays/calendars/hebrew.py +2 -2
  7. holidays/calendars/hindu.py +445 -0
  8. holidays/calendars/islamic.py +1347 -1347
  9. holidays/calendars/thai.py +229 -38
  10. holidays/countries/__init__.py +8 -0
  11. holidays/countries/albania.py +6 -17
  12. holidays/countries/andorra.py +2 -6
  13. holidays/countries/angola.py +53 -39
  14. holidays/countries/argentina.py +25 -35
  15. holidays/countries/armenia.py +1 -0
  16. holidays/countries/aruba.py +109 -48
  17. holidays/countries/australia.py +31 -69
  18. holidays/countries/austria.py +1 -0
  19. holidays/countries/azerbaijan.py +44 -71
  20. holidays/countries/bahrain.py +7 -7
  21. holidays/countries/bangladesh.py +1 -3
  22. holidays/countries/belarus.py +2 -3
  23. holidays/countries/belize.py +128 -0
  24. holidays/countries/bolivia.py +2 -6
  25. holidays/countries/bosnia_and_herzegovina.py +5 -17
  26. holidays/countries/botswana.py +37 -44
  27. holidays/countries/brazil.py +4 -7
  28. holidays/countries/brunei.py +427 -0
  29. holidays/countries/bulgaria.py +3 -6
  30. holidays/countries/burkina_faso.py +141 -0
  31. holidays/countries/burundi.py +2 -5
  32. holidays/countries/cambodia.py +323 -0
  33. holidays/countries/cameroon.py +183 -0
  34. holidays/countries/canada.py +20 -28
  35. holidays/countries/chad.py +133 -0
  36. holidays/countries/chile.py +6 -13
  37. holidays/countries/china.py +21 -25
  38. holidays/countries/colombia.py +18 -15
  39. holidays/countries/costa_rica.py +25 -27
  40. holidays/countries/cuba.py +28 -15
  41. holidays/countries/curacao.py +100 -46
  42. holidays/countries/cyprus.py +3 -6
  43. holidays/countries/czechia.py +4 -12
  44. holidays/countries/denmark.py +2 -3
  45. holidays/countries/dominican_republic.py +2 -3
  46. holidays/countries/ecuador.py +55 -54
  47. holidays/countries/egypt.py +2 -5
  48. holidays/countries/el_salvador.py +101 -0
  49. holidays/countries/eswatini.py +34 -44
  50. holidays/countries/ethiopia.py +7 -14
  51. holidays/countries/finland.py +2 -3
  52. holidays/countries/france.py +1 -0
  53. holidays/countries/gabon.py +139 -0
  54. holidays/countries/georgia.py +1 -0
  55. holidays/countries/germany.py +1 -0
  56. holidays/countries/greece.py +7 -6
  57. holidays/countries/honduras.py +17 -13
  58. holidays/countries/hongkong.py +117 -126
  59. holidays/countries/hungary.py +93 -92
  60. holidays/countries/iceland.py +1 -0
  61. holidays/countries/india.py +4 -11
  62. holidays/countries/indonesia.py +178 -142
  63. holidays/countries/ireland.py +5 -15
  64. holidays/countries/isle_of_man.py +23 -5
  65. holidays/countries/israel.py +12 -24
  66. holidays/countries/italy.py +6 -7
  67. holidays/countries/jamaica.py +10 -18
  68. holidays/countries/japan.py +11 -16
  69. holidays/countries/kazakhstan.py +7 -22
  70. holidays/countries/kenya.py +44 -26
  71. holidays/countries/kyrgyzstan.py +2 -5
  72. holidays/countries/latvia.py +2 -6
  73. holidays/countries/lesotho.py +52 -32
  74. holidays/countries/liechtenstein.py +1 -0
  75. holidays/countries/lithuania.py +4 -12
  76. holidays/countries/madagascar.py +3 -9
  77. holidays/countries/malawi.py +34 -26
  78. holidays/countries/malaysia.py +335 -343
  79. holidays/countries/marshall_islands.py +4 -9
  80. holidays/countries/mexico.py +2 -3
  81. holidays/countries/moldova.py +4 -6
  82. holidays/countries/monaco.py +17 -26
  83. holidays/countries/montenegro.py +34 -24
  84. holidays/countries/morocco.py +8 -5
  85. holidays/countries/mozambique.py +35 -31
  86. holidays/countries/namibia.py +54 -35
  87. holidays/countries/netherlands.py +1 -0
  88. holidays/countries/new_zealand.py +166 -134
  89. holidays/countries/nicaragua.py +27 -22
  90. holidays/countries/nigeria.py +6 -17
  91. holidays/countries/north_macedonia.py +3 -8
  92. holidays/countries/norway.py +2 -3
  93. holidays/countries/pakistan.py +73 -75
  94. holidays/countries/panama.py +25 -24
  95. holidays/countries/paraguay.py +55 -47
  96. holidays/countries/peru.py +1 -0
  97. holidays/countries/philippines.py +6 -2
  98. holidays/countries/poland.py +4 -9
  99. holidays/countries/portugal.py +4 -11
  100. holidays/countries/romania.py +4 -5
  101. holidays/countries/russia.py +1 -0
  102. holidays/countries/san_marino.py +26 -27
  103. holidays/countries/saudi_arabia.py +8 -22
  104. holidays/countries/serbia.py +22 -31
  105. holidays/countries/singapore.py +181 -189
  106. holidays/countries/slovakia.py +2 -4
  107. holidays/countries/south_africa.py +60 -62
  108. holidays/countries/south_korea.py +59 -26
  109. holidays/countries/spain.py +7 -10
  110. holidays/countries/sweden.py +2 -3
  111. holidays/countries/switzerland.py +1 -0
  112. holidays/countries/taiwan.py +20 -20
  113. holidays/countries/thailand.py +36 -82
  114. holidays/countries/turkey.py +1 -3
  115. holidays/countries/ukraine.py +7 -18
  116. holidays/countries/united_arab_emirates.py +23 -31
  117. holidays/countries/united_kingdom.py +124 -116
  118. holidays/countries/united_states.py +42 -72
  119. holidays/countries/uruguay.py +1 -0
  120. holidays/countries/vatican_city.py +64 -32
  121. holidays/countries/venezuela.py +9 -6
  122. holidays/countries/vietnam.py +6 -20
  123. holidays/countries/zambia.py +63 -33
  124. holidays/countries/zimbabwe.py +56 -37
  125. holidays/financial/european_central_bank.py +15 -16
  126. holidays/financial/ny_stock_exchange.py +80 -86
  127. holidays/groups/__init__.py +18 -0
  128. holidays/groups/buddhist.py +71 -0
  129. holidays/groups/chinese.py +235 -0
  130. holidays/groups/christian.py +483 -0
  131. holidays/groups/hindu.py +71 -0
  132. holidays/groups/international.py +157 -0
  133. holidays/groups/islamic.py +288 -0
  134. holidays/groups/thai.py +157 -0
  135. holidays/helpers.py +20 -0
  136. holidays/holiday_base.py +54 -76
  137. holidays/holiday_groups.py +11 -1053
  138. holidays/locale/am/LC_MESSAGES/ET.mo +0 -0
  139. holidays/locale/am/LC_MESSAGES/ET.po +20 -15
  140. holidays/locale/ar/LC_MESSAGES/CA.mo +0 -0
  141. holidays/locale/ar/LC_MESSAGES/CA.po +184 -0
  142. holidays/locale/ar/LC_MESSAGES/ET.mo +0 -0
  143. holidays/locale/ar/LC_MESSAGES/ET.po +92 -0
  144. holidays/locale/ar/LC_MESSAGES/UA.mo +0 -0
  145. holidays/locale/ar/LC_MESSAGES/UA.po +97 -0
  146. holidays/locale/be/LC_MESSAGES/BY.po +11 -13
  147. holidays/locale/bg/LC_MESSAGES/BG.po +13 -15
  148. holidays/locale/da/LC_MESSAGES/DK.po +13 -12
  149. holidays/locale/de/LC_MESSAGES/AT.po +14 -14
  150. holidays/locale/de/LC_MESSAGES/CH.po +91 -56
  151. holidays/locale/de/LC_MESSAGES/DE.po +32 -32
  152. holidays/locale/de/LC_MESSAGES/LI.po +23 -23
  153. holidays/locale/el/LC_MESSAGES/CY.po +16 -16
  154. holidays/locale/el/LC_MESSAGES/GR.mo +0 -0
  155. holidays/locale/el/LC_MESSAGES/GR.po +21 -17
  156. holidays/locale/en/LC_MESSAGES/CA.po +43 -43
  157. holidays/locale/en_US/LC_MESSAGES/AM.mo +0 -0
  158. holidays/locale/en_US/LC_MESSAGES/AM.po +20 -20
  159. holidays/locale/en_US/LC_MESSAGES/AR.mo +0 -0
  160. holidays/locale/en_US/LC_MESSAGES/AR.po +34 -33
  161. holidays/locale/en_US/LC_MESSAGES/AT.po +13 -13
  162. holidays/locale/en_US/LC_MESSAGES/AW.mo +0 -0
  163. holidays/locale/en_US/LC_MESSAGES/AW.po +87 -0
  164. holidays/locale/en_US/LC_MESSAGES/BG.po +13 -15
  165. holidays/locale/en_US/LC_MESSAGES/BN.mo +0 -0
  166. holidays/locale/en_US/LC_MESSAGES/BN.po +96 -0
  167. holidays/locale/en_US/LC_MESSAGES/BY.po +11 -13
  168. holidays/locale/en_US/LC_MESSAGES/CA.mo +0 -0
  169. holidays/locale/en_US/LC_MESSAGES/CA.po +70 -37
  170. holidays/locale/en_US/LC_MESSAGES/CH.po +91 -56
  171. holidays/locale/en_US/LC_MESSAGES/CL.po +39 -38
  172. holidays/locale/en_US/LC_MESSAGES/CO.mo +0 -0
  173. holidays/locale/en_US/LC_MESSAGES/CO.po +27 -27
  174. holidays/locale/en_US/LC_MESSAGES/CR.mo +0 -0
  175. holidays/locale/en_US/LC_MESSAGES/CR.po +19 -19
  176. holidays/locale/en_US/LC_MESSAGES/CU.po +10 -10
  177. holidays/locale/en_US/LC_MESSAGES/CW.mo +0 -0
  178. holidays/locale/en_US/LC_MESSAGES/CW.po +82 -0
  179. holidays/locale/en_US/LC_MESSAGES/CY.po +16 -16
  180. holidays/locale/en_US/LC_MESSAGES/DE.po +30 -30
  181. holidays/locale/en_US/LC_MESSAGES/DK.po +12 -11
  182. holidays/locale/en_US/LC_MESSAGES/DO.po +12 -12
  183. holidays/locale/en_US/LC_MESSAGES/EC.po +11 -12
  184. holidays/locale/en_US/LC_MESSAGES/ET.mo +0 -0
  185. holidays/locale/en_US/LC_MESSAGES/ET.po +20 -15
  186. holidays/locale/en_US/LC_MESSAGES/FI.po +15 -15
  187. holidays/locale/en_US/LC_MESSAGES/FR.po +27 -24
  188. holidays/locale/en_US/LC_MESSAGES/GE.po +23 -27
  189. holidays/locale/en_US/LC_MESSAGES/GR.mo +0 -0
  190. holidays/locale/en_US/LC_MESSAGES/GR.po +21 -17
  191. holidays/locale/en_US/LC_MESSAGES/HN.mo +0 -0
  192. holidays/locale/en_US/LC_MESSAGES/HN.po +17 -12
  193. holidays/locale/en_US/LC_MESSAGES/HU.mo +0 -0
  194. holidays/locale/en_US/LC_MESSAGES/HU.po +109 -0
  195. holidays/locale/en_US/LC_MESSAGES/IS.po +17 -17
  196. holidays/locale/en_US/LC_MESSAGES/JP.po +25 -25
  197. holidays/locale/en_US/LC_MESSAGES/KH.mo +0 -0
  198. holidays/locale/en_US/LC_MESSAGES/KH.po +139 -0
  199. holidays/locale/en_US/LC_MESSAGES/LI.po +22 -22
  200. holidays/locale/en_US/LC_MESSAGES/MC.mo +0 -0
  201. holidays/locale/en_US/LC_MESSAGES/MC.po +27 -27
  202. holidays/locale/en_US/LC_MESSAGES/MD.po +13 -13
  203. holidays/locale/en_US/LC_MESSAGES/MX.po +9 -12
  204. holidays/locale/en_US/LC_MESSAGES/NI.mo +0 -0
  205. holidays/locale/en_US/LC_MESSAGES/NI.po +15 -15
  206. holidays/locale/en_US/LC_MESSAGES/NL.po +12 -12
  207. holidays/locale/en_US/LC_MESSAGES/NO.po +13 -13
  208. holidays/locale/en_US/LC_MESSAGES/PE.po +30 -30
  209. holidays/locale/en_US/LC_MESSAGES/PL.po +38 -21
  210. holidays/locale/en_US/LC_MESSAGES/PT.po +39 -36
  211. holidays/locale/en_US/LC_MESSAGES/PY.po +16 -16
  212. holidays/locale/en_US/LC_MESSAGES/RO.po +12 -12
  213. holidays/locale/en_US/LC_MESSAGES/RS.mo +0 -0
  214. holidays/locale/en_US/LC_MESSAGES/RS.po +17 -19
  215. holidays/locale/en_US/LC_MESSAGES/RU.po +11 -10
  216. holidays/locale/en_US/LC_MESSAGES/SE.po +19 -19
  217. holidays/locale/en_US/LC_MESSAGES/SK.po +17 -18
  218. holidays/locale/en_US/LC_MESSAGES/TH.po +41 -41
  219. holidays/locale/en_US/LC_MESSAGES/UA.po +18 -19
  220. holidays/locale/en_US/LC_MESSAGES/UY.po +15 -15
  221. holidays/locale/en_US/LC_MESSAGES/VE.po +16 -16
  222. holidays/locale/es/LC_MESSAGES/AR.mo +0 -0
  223. holidays/locale/es/LC_MESSAGES/AR.po +34 -33
  224. holidays/locale/es/LC_MESSAGES/CL.po +39 -38
  225. holidays/locale/es/LC_MESSAGES/CO.mo +0 -0
  226. holidays/locale/es/LC_MESSAGES/CO.po +24 -24
  227. holidays/locale/es/LC_MESSAGES/CR.mo +0 -0
  228. holidays/locale/es/LC_MESSAGES/CR.po +19 -19
  229. holidays/locale/es/LC_MESSAGES/CU.po +10 -10
  230. holidays/locale/es/LC_MESSAGES/DO.po +12 -12
  231. holidays/locale/es/LC_MESSAGES/EC.po +11 -12
  232. holidays/locale/es/LC_MESSAGES/HN.mo +0 -0
  233. holidays/locale/es/LC_MESSAGES/HN.po +17 -12
  234. holidays/locale/es/LC_MESSAGES/MX.po +9 -12
  235. holidays/locale/es/LC_MESSAGES/NI.po +12 -12
  236. holidays/locale/es/LC_MESSAGES/PE.po +30 -30
  237. holidays/locale/es/LC_MESSAGES/PY.po +16 -16
  238. holidays/locale/es/LC_MESSAGES/UY.po +15 -15
  239. holidays/locale/es/LC_MESSAGES/VE.po +16 -16
  240. holidays/locale/fi/LC_MESSAGES/FI.po +16 -16
  241. holidays/locale/fr/LC_MESSAGES/CA.po +43 -43
  242. holidays/locale/fr/LC_MESSAGES/CH.po +91 -56
  243. holidays/locale/fr/LC_MESSAGES/FR.po +27 -24
  244. holidays/locale/fr/LC_MESSAGES/MC.po +23 -23
  245. holidays/locale/hu/LC_MESSAGES/HU.mo +0 -0
  246. holidays/locale/hu/LC_MESSAGES/HU.po +109 -0
  247. holidays/locale/hy/LC_MESSAGES/AM.po +16 -16
  248. holidays/locale/is/LC_MESSAGES/IS.po +18 -18
  249. holidays/locale/it/LC_MESSAGES/CH.po +91 -56
  250. holidays/locale/ja/LC_MESSAGES/JP.po +25 -25
  251. holidays/locale/ka/LC_MESSAGES/GE.po +23 -27
  252. holidays/locale/km/LC_MESSAGES/KH.mo +0 -0
  253. holidays/locale/km/LC_MESSAGES/KH.po +139 -0
  254. holidays/locale/ms/LC_MESSAGES/BN.mo +0 -0
  255. holidays/locale/ms/LC_MESSAGES/BN.po +96 -0
  256. holidays/locale/nl/LC_MESSAGES/AW.mo +0 -0
  257. holidays/locale/nl/LC_MESSAGES/AW.po +87 -0
  258. holidays/locale/nl/LC_MESSAGES/CW.mo +0 -0
  259. holidays/locale/nl/LC_MESSAGES/CW.po +82 -0
  260. holidays/locale/nl/LC_MESSAGES/NL.po +13 -13
  261. holidays/locale/no/LC_MESSAGES/NO.po +14 -14
  262. holidays/locale/pap/LC_MESSAGES/AW.mo +0 -0
  263. holidays/locale/pap/LC_MESSAGES/AW.po +87 -0
  264. holidays/locale/pap/LC_MESSAGES/CW.mo +0 -0
  265. holidays/locale/pap/LC_MESSAGES/CW.po +82 -0
  266. holidays/locale/pl/LC_MESSAGES/PL.po +38 -21
  267. holidays/locale/pt_PT/LC_MESSAGES/PT.po +39 -36
  268. holidays/locale/ro/LC_MESSAGES/MD.po +14 -15
  269. holidays/locale/ro/LC_MESSAGES/RO.po +13 -14
  270. holidays/locale/ru/LC_MESSAGES/RU.po +11 -9
  271. holidays/locale/sk/LC_MESSAGES/SK.po +17 -18
  272. holidays/locale/sr/LC_MESSAGES/RS.mo +0 -0
  273. holidays/locale/sr/LC_MESSAGES/RS.po +15 -17
  274. holidays/locale/sv/LC_MESSAGES/FI.po +16 -16
  275. holidays/locale/sv/LC_MESSAGES/SE.po +20 -20
  276. holidays/locale/th/LC_MESSAGES/BN.mo +0 -0
  277. holidays/locale/th/LC_MESSAGES/BN.po +96 -0
  278. holidays/locale/th/LC_MESSAGES/CA.po +42 -42
  279. holidays/locale/th/LC_MESSAGES/KH.mo +0 -0
  280. holidays/locale/th/LC_MESSAGES/KH.po +145 -0
  281. holidays/locale/th/LC_MESSAGES/TH.po +41 -41
  282. holidays/locale/uk/LC_MESSAGES/AR.mo +0 -0
  283. holidays/locale/uk/LC_MESSAGES/AR.po +35 -35
  284. holidays/locale/uk/LC_MESSAGES/AT.po +15 -16
  285. holidays/locale/uk/LC_MESSAGES/AW.mo +0 -0
  286. holidays/locale/uk/LC_MESSAGES/AW.po +87 -0
  287. holidays/locale/uk/LC_MESSAGES/CH.po +92 -58
  288. holidays/locale/uk/LC_MESSAGES/CL.po +40 -40
  289. holidays/locale/uk/LC_MESSAGES/CO.mo +0 -0
  290. holidays/locale/uk/LC_MESSAGES/CO.po +28 -29
  291. holidays/locale/uk/LC_MESSAGES/CR.mo +0 -0
  292. holidays/locale/uk/LC_MESSAGES/CR.po +20 -21
  293. holidays/locale/uk/LC_MESSAGES/CU.po +11 -12
  294. holidays/locale/uk/LC_MESSAGES/CW.mo +0 -0
  295. holidays/locale/uk/LC_MESSAGES/CW.po +82 -0
  296. holidays/locale/uk/LC_MESSAGES/DE.po +33 -34
  297. holidays/locale/uk/LC_MESSAGES/DK.po +14 -14
  298. holidays/locale/uk/LC_MESSAGES/DO.po +13 -14
  299. holidays/locale/uk/LC_MESSAGES/EC.po +12 -14
  300. holidays/locale/uk/LC_MESSAGES/FI.po +17 -18
  301. holidays/locale/uk/LC_MESSAGES/FR.po +28 -26
  302. holidays/locale/uk/LC_MESSAGES/HN.mo +0 -0
  303. holidays/locale/uk/LC_MESSAGES/HN.po +18 -14
  304. holidays/locale/uk/LC_MESSAGES/HU.mo +0 -0
  305. holidays/locale/uk/LC_MESSAGES/HU.po +109 -0
  306. holidays/locale/uk/LC_MESSAGES/IS.po +19 -20
  307. holidays/locale/uk/LC_MESSAGES/LI.po +24 -25
  308. holidays/locale/uk/LC_MESSAGES/MC.po +27 -28
  309. holidays/locale/uk/LC_MESSAGES/MD.po +14 -15
  310. holidays/locale/uk/LC_MESSAGES/MX.po +10 -14
  311. holidays/locale/uk/LC_MESSAGES/NI.mo +0 -0
  312. holidays/locale/uk/LC_MESSAGES/NI.po +16 -17
  313. holidays/locale/uk/LC_MESSAGES/NL.po +14 -15
  314. holidays/locale/uk/LC_MESSAGES/NO.po +15 -16
  315. holidays/locale/uk/LC_MESSAGES/PE.po +31 -32
  316. holidays/locale/uk/LC_MESSAGES/PL.po +38 -21
  317. holidays/locale/uk/LC_MESSAGES/PY.po +17 -18
  318. holidays/locale/uk/LC_MESSAGES/RO.po +13 -14
  319. holidays/locale/uk/LC_MESSAGES/SE.po +21 -22
  320. holidays/locale/uk/LC_MESSAGES/SK.po +18 -20
  321. holidays/locale/uk/LC_MESSAGES/UA.po +17 -17
  322. holidays/locale/uk/LC_MESSAGES/UY.po +16 -17
  323. holidays/locale/uk/LC_MESSAGES/VE.po +17 -18
  324. holidays/registry.py +21 -12
  325. holidays/utils.py +87 -17
  326. {holidays-0.25.dist-info → holidays-0.27.dist-info}/METADATA +282 -265
  327. holidays-0.27.dist-info/RECORD +449 -0
  328. holidays-0.25.dist-info/RECORD +0 -390
  329. {holidays-0.25.dist-info → holidays-0.27.dist-info}/LICENSE +0 -0
  330. {holidays-0.25.dist-info → holidays-0.27.dist-info}/WHEEL +0 -0
  331. {holidays-0.25.dist-info → holidays-0.27.dist-info}/top_level.txt +0 -0
@@ -12,19 +12,48 @@
12
12
  from datetime import date
13
13
  from datetime import timedelta as td
14
14
 
15
- from holidays.calendars import _CustomCalendar, _IslamicLunar
16
- from holidays.calendars import _get_nth_weekday_of_month
17
- from holidays.constants import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP
18
- from holidays.constants import OCT, NOV, DEC, MON, FRI, SAT, SUN
15
+ from holidays.calendars import (
16
+ _CustomBuddhistCalendar,
17
+ _CustomChineseCalendar,
18
+ _CustomHinduCalendar,
19
+ _CustomIslamicCalendar,
20
+ _get_nth_weekday_of_month,
21
+ )
22
+ from holidays.constants import (
23
+ JAN,
24
+ FEB,
25
+ MAR,
26
+ APR,
27
+ MAY,
28
+ JUN,
29
+ JUL,
30
+ AUG,
31
+ SEP,
32
+ OCT,
33
+ NOV,
34
+ DEC,
35
+ MON,
36
+ FRI,
37
+ SAT,
38
+ SUN,
39
+ )
19
40
  from holidays.holiday_base import HolidayBase
20
- from holidays.holiday_groups import ChineseCalendarHolidays, ChristianHolidays
21
- from holidays.holiday_groups import InternationalHolidays, IslamicHolidays
41
+ from holidays.holiday_groups import (
42
+ BuddhistCalendarHolidays,
43
+ ChineseCalendarHolidays,
44
+ ChristianHolidays,
45
+ HinduCalendarHolidays,
46
+ InternationalHolidays,
47
+ IslamicHolidays,
48
+ )
22
49
 
23
50
 
24
51
  class Malaysia(
25
52
  HolidayBase,
53
+ BuddhistCalendarHolidays,
26
54
  ChineseCalendarHolidays,
27
55
  ChristianHolidays,
56
+ HinduCalendarHolidays,
28
57
  InternationalHolidays,
29
58
  IslamicHolidays,
30
59
  ):
@@ -33,9 +62,9 @@ class Malaysia(
33
62
  # The years 1955 1959 1995 seems to have the elections
34
63
  # one weekday but I am not sure if they were marked as
35
64
  # holidays.
36
- 1999: ((NOV, 29, "Malaysia General Election Holiday"),),
37
- 2018: ((MAY, 9, "Malaysia General Election Holiday"),),
38
- 2019: ((JUL, 30, "Installation of New King"),),
65
+ 1999: (NOV, 29, "Malaysia General Election Holiday"),
66
+ 2018: (MAY, 9, "Malaysia General Election Holiday"),
67
+ 2019: (JUL, 30, "Installation of New King"),
39
68
  }
40
69
  subdivisions = (
41
70
  "JHR",
@@ -96,8 +125,14 @@ class Malaysia(
96
125
 
97
126
  See parameters and usage in :py:class:`HolidayBase`.
98
127
  """
99
- ChineseCalendarHolidays.__init__(self)
128
+ BuddhistCalendarHolidays.__init__(
129
+ self, calendar=MalaysiaBuddhistCalendar(), show_estimated=True
130
+ )
131
+ ChineseCalendarHolidays.__init__(
132
+ self, calendar=MalaysiaChineseCalendar(), show_estimated=True
133
+ )
100
134
  ChristianHolidays.__init__(self)
135
+ HinduCalendarHolidays.__init__(self, calendar=MalaysiaHinduCalendar())
101
136
  InternationalHolidays.__init__(self)
102
137
  IslamicHolidays.__init__(self, calendar=MalaysiaIslamicCalendar())
103
138
  super().__init__(*args, **kwargs)
@@ -106,55 +141,16 @@ class Malaysia(
106
141
  super()._populate(year)
107
142
  observed_dates = set()
108
143
 
109
- estimated_suffix = "* (*estimated)"
110
-
111
144
  # Chinese New Year (one day in the States of Kelantan and Terengganu,
112
145
  # two days in the other States).
113
146
  observed_dates.add(self._add_chinese_new_years_day("Chinese New Year"))
114
147
  # The second day of Chinese New Year is not a federal holiday in
115
148
  # Kelantan and Terengganu. However, it is gazetted as a state holiday
116
149
  # in both states, effectively making it a nationwide holiday.
117
- observed_dates.add(
118
- self._add_chinese_new_years_day_two("Chinese New Year Holiday")
119
- )
150
+ observed_dates.add(self._add_chinese_new_years_day_two("Chinese New Year Holiday"))
120
151
 
121
- # Wesak Day.
122
- # Date of observance is announced yearly
123
- # https://en.wikipedia.org/wiki/Vesak#Dates_of_observance
124
- dates_obs = {
125
- 2001: (MAY, 7),
126
- 2002: (MAY, 27),
127
- 2003: (MAY, 15),
128
- 2004: (MAY, 3),
129
- 2005: (MAY, 23),
130
- 2006: (MAY, 12),
131
- 2007: (MAY, 1),
132
- 2008: (MAY, 19),
133
- 2009: (MAY, 9),
134
- 2010: (MAY, 28),
135
- 2011: (MAY, 17),
136
- 2012: (MAY, 5),
137
- 2013: (MAY, 24),
138
- 2014: (MAY, 13),
139
- 2015: (MAY, 3),
140
- 2016: (MAY, 21),
141
- 2017: (MAY, 10),
142
- 2018: (MAY, 29),
143
- 2019: (MAY, 19),
144
- 2020: (MAY, 7),
145
- 2021: (MAY, 26),
146
- 2022: (MAY, 15),
147
- }
148
- name = "Vesak Day"
149
- if year in dates_obs:
150
- observed_dates.add(self._add_holiday(name, *dates_obs[year]))
151
- else:
152
- observed_dates.add(
153
- self._add_holiday(
154
- f"{name}{estimated_suffix}",
155
- self._chinese_calendar.vesak_may_date(year),
156
- )
157
- )
152
+ # Vesak Day.
153
+ observed_dates.add(self._add_vesak_may("Vesak Day"))
158
154
 
159
155
  # Labour Day.
160
156
  observed_dates.add(self._add_labor_day("Labour Day"))
@@ -169,11 +165,7 @@ class Malaysia(
169
165
  hol_date = date(2020, JUN, 8)
170
166
  else:
171
167
  hol_date = _get_nth_weekday_of_month(1, MON, JUN, year)
172
- observed_dates.add(
173
- self._add_holiday(
174
- "Birthday of SPB Yang di-Pertuan Agong", hol_date
175
- )
176
- )
168
+ observed_dates.add(self._add_holiday("Birthday of SPB Yang di-Pertuan Agong", hol_date))
177
169
 
178
170
  # Hari Kebangsaan or National Day.
179
171
  observed_dates.add(self._add_holiday("National Day", AUG, 31))
@@ -182,44 +174,9 @@ class Malaysia(
182
174
  if year >= 2010:
183
175
  observed_dates.add(self._add_holiday("Malaysia Day", SEP, 16))
184
176
 
185
- # Deepavali.
186
- # aka Diwali;
187
- # date of observance is announced yearly
177
+ # Deepavali (Diwali).
188
178
  if self.subdiv != "SWK":
189
- dates_obs = {
190
- 2001: (NOV, 14),
191
- 2002: (NOV, 3),
192
- 2003: (OCT, 23),
193
- 2004: (NOV, 11),
194
- 2005: (NOV, 1),
195
- 2006: (OCT, 21),
196
- 2007: (NOV, 8),
197
- 2008: (OCT, 27),
198
- 2009: (OCT, 17),
199
- 2010: (NOV, 5),
200
- 2011: (OCT, 26),
201
- 2012: (NOV, 13),
202
- 2013: (NOV, 2),
203
- 2014: (OCT, 22),
204
- 2015: (NOV, 10),
205
- 2016: (OCT, 29),
206
- 2017: (OCT, 18),
207
- 2018: (NOV, 6),
208
- 2019: (OCT, 27),
209
- 2020: (NOV, 14),
210
- 2021: (NOV, 4),
211
- 2022: (OCT, 24),
212
- }
213
- name = "Deepavali"
214
- if year in dates_obs:
215
- observed_dates.add(self._add_holiday(name, *dates_obs[year]))
216
- else:
217
- observed_dates.add(
218
- self._add_holiday( # type: ignore[arg-type]
219
- f"{name}{estimated_suffix}",
220
- self._convert_chinese_to_gre(10, 1) + td(days=-2),
221
- )
222
- )
179
+ observed_dates.add(self._add_diwali("Deepavali"))
223
180
 
224
181
  # Christmas day.
225
182
  observed_dates.add(self._add_christmas_day("Christmas Day"))
@@ -227,9 +184,7 @@ class Malaysia(
227
184
  # Birthday of the Prophet Muhammad (s.a.w.).
228
185
  # a.k.a. Hari Keputeraan Nabi Muhammad (Sabah Act)
229
186
  observed_dates.update(
230
- self._add_mawlid_day(
231
- "Maulidur Rasul (Birthday of the Prophet Muhammad)"
232
- )
187
+ self._add_mawlid_day("Maulidur Rasul (Birthday of the Prophet Muhammad)")
233
188
  )
234
189
 
235
190
  # Hari Raya Puasa (2 days).
@@ -237,9 +192,7 @@ class Malaysia(
237
192
  # exact date of observance is announced yearly
238
193
  name = "Hari Raya Puasa"
239
194
  observed_dates.update(self._add_eid_al_fitr_day(name))
240
- observed_dates.update(
241
- self._add_eid_al_fitr_day_two(f"Second day of {name}")
242
- )
195
+ observed_dates.update(self._add_eid_al_fitr_day_two(f"Second day of {name}"))
243
196
 
244
197
  # Arafat Day.
245
198
  if self.subdiv == "TRG":
@@ -268,18 +221,12 @@ class Malaysia(
268
221
  observed_dates.add(self._add_new_years_day("New Year's Day"))
269
222
 
270
223
  # Isra and Mi'raj.
271
- if self.subdiv in {"KDH", "NSN", "PLS"} or (
272
- self.subdiv == "TRG" and year >= 2020
273
- ):
274
- observed_dates.update(
275
- self._add_isra_and_miraj_day("Isra and Mi'raj")
276
- )
224
+ if self.subdiv in {"KDH", "NSN", "PLS"} or (self.subdiv == "TRG" and year >= 2020):
225
+ observed_dates.update(self._add_isra_and_miraj_day("Isra and Mi'raj"))
277
226
 
278
227
  # Beginning of Ramadan.
279
228
  if self.subdiv in {"JHR", "KDH", "MLK"}:
280
- observed_dates.update(
281
- self._add_ramadan_beginning_day("Beginning of Ramadan")
282
- )
229
+ observed_dates.update(self._add_ramadan_beginning_day("Beginning of Ramadan"))
283
230
 
284
231
  # Nuzul Al-Quran Day.
285
232
  if self.subdiv in {
@@ -294,51 +241,22 @@ class Malaysia(
294
241
  "SGR",
295
242
  "TRG",
296
243
  }:
297
- observed_dates.update(
298
- self._add_nuzul_al_quran_day("Nuzul Al-Quran Day")
299
- )
244
+ observed_dates.update(self._add_nuzul_al_quran_day("Nuzul Al-Quran Day"))
300
245
 
301
246
  # Thaipusam.
302
- # An annual Hindu festival observed on the day of the first full moon
303
- # during the Tamil month of Thai
304
247
  if self.subdiv in {"JHR", "KUL", "NSN", "PJY", "PNG", "PRK", "SGR"}:
305
- dates_obs = {
306
- 2018: (JAN, 31),
307
- 2019: (JAN, 21),
308
- 2020: (FEB, 8),
309
- 2021: (JAN, 28),
310
- 2022: (JAN, 18),
311
- 2023: (FEB, 5),
312
- 2024: (JAN, 25),
313
- 2025: (FEB, 11),
314
- 2026: (FEB, 1),
315
- 2027: (JAN, 22),
316
- }
317
- name = "Thaipusam"
318
- if year in dates_obs:
319
- observed_dates.add(self._add_holiday(name, *dates_obs[year]))
320
- else:
321
- observed_dates.add(
322
- self._add_holiday(
323
- f"{name}{estimated_suffix}",
324
- self._chinese_calendar.thaipusam_date(year),
325
- )
326
- )
248
+ observed_dates.add(self._add_thaipusam("Thaipusam"))
327
249
 
328
250
  # Federal Territory Day.
329
251
  if self.subdiv in {"KUL", "LBN", "PJY"} and year >= 1974:
330
- observed_dates.add(
331
- self._add_holiday("Federal Territory Day", FEB, 1)
332
- )
252
+ observed_dates.add(self._add_holiday("Federal Territory Day", FEB, 1))
333
253
 
334
254
  # State holidays (single state)
335
255
 
336
256
  if self.subdiv == "MLK":
337
257
  if year >= 1989:
338
258
  observed_dates.add(
339
- self._add_holiday(
340
- "Declaration of Malacca as a Historical City", APR, 15
341
- )
259
+ self._add_holiday("Declaration of Malacca as a Historical City", APR, 15)
342
260
  )
343
261
 
344
262
  observed_dates.add(
@@ -352,30 +270,20 @@ class Malaysia(
352
270
 
353
271
  elif self.subdiv == "NSN" and year >= 2009:
354
272
  observed_dates.add(
355
- self._add_holiday(
356
- "Birthday of the Sultan of Negeri Sembilan", JAN, 14
357
- )
273
+ self._add_holiday("Birthday of the Sultan of Negeri Sembilan", JAN, 14)
358
274
  )
359
275
 
360
276
  elif self.subdiv == "PHG" and year >= 1975:
361
277
  observed_dates.add(
362
- self._add_holiday(
363
- "Hari Hol of Pahang", MAY, 22 if year >= 2021 else 7
364
- )
278
+ self._add_holiday("Hari Hol of Pahang", MAY, 22 if year >= 2021 else 7)
365
279
  )
366
280
 
367
281
  hol_date = (JUL, 30) if year >= 2019 else (OCT, 24)
368
- observed_dates.add(
369
- self._add_holiday(
370
- "Birthday of the Sultan of Pahang", *hol_date
371
- )
372
- )
282
+ observed_dates.add(self._add_holiday("Birthday of the Sultan of Pahang", *hol_date))
373
283
 
374
284
  elif self.subdiv == "PNG":
375
285
  if year >= 2009:
376
- observed_dates.add(
377
- self._add_holiday("George Town Heritage Day", JUL, 7)
378
- )
286
+ observed_dates.add(self._add_holiday("George Town Heritage Day", JUL, 7))
379
287
 
380
288
  observed_dates.add(
381
289
  self._add_holiday(
@@ -386,23 +294,15 @@ class Malaysia(
386
294
 
387
295
  elif self.subdiv == "PLS" and year >= 2000:
388
296
  hol_date = (JUL, 17) if year >= 2018 else (MAY, 17)
389
- observed_dates.add(
390
- self._add_holiday("Birthday of The Raja of Perlis", *hol_date)
391
- )
297
+ observed_dates.add(self._add_holiday("Birthday of The Raja of Perlis", *hol_date))
392
298
 
393
299
  elif self.subdiv == "SGR":
394
- observed_dates.add(
395
- self._add_holiday(
396
- "Birthday of The Sultan of Selangor", DEC, 11
397
- )
398
- )
300
+ observed_dates.add(self._add_holiday("Birthday of The Sultan of Selangor", DEC, 11))
399
301
 
400
302
  elif self.subdiv == "SWK":
401
303
  # Dayak Festival Day (the first day of June) and the following day.
402
304
  observed_dates.add(self._add_holiday("Gawai Dayak", JUN, 1))
403
- observed_dates.add(
404
- self._add_holiday("Gawai Dayak (Second day)", JUN, 2)
405
- )
305
+ observed_dates.add(self._add_holiday("Gawai Dayak (Second day)", JUN, 2))
406
306
 
407
307
  # Birthday of Tuan Yang Terutama Yang di-Pertua Negeri Sarawak
408
308
  # (the second Saturday of October).
@@ -420,18 +320,13 @@ class Malaysia(
420
320
  elif self.subdiv == "TRG" and year >= 2000:
421
321
  observed_dates.add(
422
322
  self._add_holiday(
423
- "Anniversary of the Installation "
424
- "of the Sultan of Terengganu",
323
+ "Anniversary of the Installation of the Sultan of Terengganu",
425
324
  MAR,
426
325
  4,
427
326
  )
428
327
  )
429
328
 
430
- observed_dates.add(
431
- self._add_holiday(
432
- "Birthday of the Sultan of Terengganu", APR, 26
433
- )
434
- )
329
+ observed_dates.add(self._add_holiday("Birthday of the Sultan of Terengganu", APR, 26))
435
330
 
436
331
  # Check for holidays that fall on a Sunday and
437
332
  # implement Section 3 of Malaysian Holidays Act:
@@ -445,9 +340,7 @@ class Malaysia(
445
340
  weekday_observed_days = (
446
341
  (FRI, +2)
447
342
  if self.subdiv in {"JHR", "KDH"}
448
- else (
449
- (SAT, +1) if self.subdiv in {"KTN", "TRG"} else (SUN, +1)
450
- )
343
+ else ((SAT, +1) if self.subdiv in {"KTN", "TRG"} else (SUN, +1))
451
344
  )
452
345
  observed_dates.difference_update({None})
453
346
  for hol_date in sorted(observed_dates):
@@ -505,9 +398,7 @@ class Malaysia(
505
398
  self._add_holiday("Birthday of the Sultan of Johor", MAR, 23)
506
399
 
507
400
  if year >= 2011:
508
- self._add_hari_hol_johor(
509
- "Hari Hol of Sultan Iskandar of Johor"
510
- )
401
+ self._add_hari_hol_johor("Hari Hol of Sultan Iskandar of Johor")
511
402
 
512
403
  elif self.subdiv == "KDH" and year >= 2020:
513
404
  self._add_holiday(
@@ -548,192 +439,293 @@ class MYS(Malaysia):
548
439
  pass
549
440
 
550
441
 
551
- class MalaysiaIslamicCalendar(_CustomCalendar, _IslamicLunar):
442
+ class MalaysiaBuddhistCalendar(_CustomBuddhistCalendar):
443
+ VESAK_MAY_DATES = {
444
+ 2001: (MAY, 7),
445
+ 2002: (MAY, 27),
446
+ 2003: (MAY, 15),
447
+ 2004: (MAY, 3),
448
+ 2005: (MAY, 22),
449
+ 2006: (MAY, 12),
450
+ 2007: (MAY, 1),
451
+ 2008: (MAY, 19),
452
+ 2009: (MAY, 9),
453
+ 2010: (MAY, 28),
454
+ 2011: (MAY, 17),
455
+ 2012: (MAY, 5),
456
+ 2013: (MAY, 24),
457
+ 2014: (MAY, 13),
458
+ 2015: (MAY, 3),
459
+ 2016: (MAY, 21),
460
+ 2017: (MAY, 10),
461
+ 2018: (MAY, 29),
462
+ 2019: (MAY, 19),
463
+ 2020: (MAY, 7),
464
+ 2021: (MAY, 26),
465
+ 2022: (MAY, 15),
466
+ 2023: (MAY, 4),
467
+ }
468
+
469
+
470
+ class MalaysiaChineseCalendar(_CustomChineseCalendar):
471
+ LUNAR_NEW_YEAR_DATES = {
472
+ 2001: (JAN, 24),
473
+ 2002: (FEB, 12),
474
+ 2003: (FEB, 1),
475
+ 2004: (JAN, 22),
476
+ 2005: (FEB, 9),
477
+ 2006: (JAN, 29),
478
+ 2007: (FEB, 18),
479
+ 2008: (FEB, 7),
480
+ 2009: (JAN, 26),
481
+ 2010: (FEB, 14),
482
+ 2011: (FEB, 3),
483
+ 2012: (JAN, 23),
484
+ 2013: (FEB, 10),
485
+ 2014: (JAN, 31),
486
+ 2015: (FEB, 19),
487
+ 2016: (FEB, 8),
488
+ 2017: (JAN, 28),
489
+ 2018: (FEB, 16),
490
+ 2019: (FEB, 5),
491
+ 2020: (JAN, 25),
492
+ 2021: (FEB, 12),
493
+ 2022: (FEB, 1),
494
+ 2023: (JAN, 22),
495
+ }
496
+
497
+
498
+ class MalaysiaHinduCalendar(_CustomHinduCalendar):
499
+ DIWALI_DATES = {
500
+ 2001: (NOV, 14),
501
+ 2002: (NOV, 3),
502
+ 2003: (OCT, 23),
503
+ 2004: (NOV, 11),
504
+ 2005: (NOV, 1),
505
+ 2006: (OCT, 21),
506
+ 2007: (NOV, 8),
507
+ 2008: (OCT, 27),
508
+ 2009: (OCT, 17),
509
+ 2010: (NOV, 5),
510
+ 2011: (OCT, 26),
511
+ 2012: (NOV, 13),
512
+ 2013: (NOV, 2),
513
+ 2014: (OCT, 22),
514
+ 2015: (NOV, 10),
515
+ 2016: (OCT, 29),
516
+ 2017: (OCT, 18),
517
+ 2018: (NOV, 6),
518
+ 2019: (OCT, 27),
519
+ 2020: (NOV, 14),
520
+ 2021: (NOV, 4),
521
+ 2022: (OCT, 24),
522
+ 2023: (NOV, 12),
523
+ }
524
+
525
+ THAIPUSAM_DATES = {
526
+ 2018: (JAN, 31),
527
+ 2019: (JAN, 21),
528
+ 2020: (FEB, 8),
529
+ 2021: (JAN, 28),
530
+ 2022: (JAN, 18),
531
+ 2023: (FEB, 5),
532
+ 2024: (JAN, 25),
533
+ 2025: (FEB, 11),
534
+ 2026: (FEB, 1),
535
+ 2027: (JAN, 22),
536
+ }
537
+
538
+
539
+ class MalaysiaIslamicCalendar(_CustomIslamicCalendar):
552
540
  EID_AL_ADHA_DATES = {
553
- 2001: ((MAR, 6),),
554
- 2002: ((FEB, 23),),
555
- 2003: ((FEB, 12),),
556
- 2004: ((FEB, 2),),
557
- 2005: ((JAN, 21),),
541
+ 2001: (MAR, 6),
542
+ 2002: (FEB, 23),
543
+ 2003: (FEB, 12),
544
+ 2004: (FEB, 2),
545
+ 2005: (JAN, 21),
558
546
  2006: ((JAN, 10), (DEC, 31)),
559
- 2007: ((DEC, 20),),
560
- 2008: ((DEC, 9),),
561
- 2009: ((NOV, 28),),
562
- 2010: ((NOV, 17),),
563
- 2011: ((NOV, 7),),
564
- 2012: ((OCT, 26),),
565
- 2013: ((OCT, 15),),
566
- 2014: ((OCT, 5),),
567
- 2015: ((SEP, 24),),
568
- 2016: ((SEP, 12),),
569
- 2017: ((SEP, 1),),
570
- 2018: ((AUG, 22),),
571
- 2019: ((AUG, 11),),
572
- 2020: ((JUL, 31),),
573
- 2021: ((JUL, 20),),
574
- 2022: ((JUL, 10),),
547
+ 2007: (DEC, 20),
548
+ 2008: (DEC, 9),
549
+ 2009: (NOV, 28),
550
+ 2010: (NOV, 17),
551
+ 2011: (NOV, 7),
552
+ 2012: (OCT, 26),
553
+ 2013: (OCT, 15),
554
+ 2014: (OCT, 5),
555
+ 2015: (SEP, 24),
556
+ 2016: (SEP, 12),
557
+ 2017: (SEP, 1),
558
+ 2018: (AUG, 22),
559
+ 2019: (AUG, 11),
560
+ 2020: (JUL, 31),
561
+ 2021: (JUL, 20),
562
+ 2022: (JUL, 10),
575
563
  }
576
564
 
577
565
  EID_AL_FITR_DATES = {
578
- 2001: ((DEC, 17),),
579
- 2002: ((DEC, 6),),
580
- 2003: ((NOV, 26),),
581
- 2004: ((NOV, 14),),
582
- 2005: ((NOV, 3),),
583
- 2006: ((OCT, 24),),
584
- 2007: ((OCT, 13),),
585
- 2008: ((OCT, 1),),
586
- 2009: ((SEP, 20),),
587
- 2010: ((SEP, 10),),
588
- 2011: ((AUG, 31),),
589
- 2012: ((AUG, 19),),
590
- 2013: ((AUG, 8),),
591
- 2014: ((JUL, 28),),
592
- 2015: ((JUL, 17),),
593
- 2016: ((JUL, 6),),
594
- 2017: ((JUN, 25),),
595
- 2018: ((JUN, 15),),
596
- 2019: ((JUN, 5),),
597
- 2020: ((MAY, 24),),
598
- 2021: ((MAY, 13),),
599
- 2022: ((MAY, 2),),
566
+ 2001: (DEC, 17),
567
+ 2002: (DEC, 6),
568
+ 2003: (NOV, 26),
569
+ 2004: (NOV, 14),
570
+ 2005: (NOV, 3),
571
+ 2006: (OCT, 24),
572
+ 2007: (OCT, 13),
573
+ 2008: (OCT, 1),
574
+ 2009: (SEP, 20),
575
+ 2010: (SEP, 10),
576
+ 2011: (AUG, 31),
577
+ 2012: (AUG, 19),
578
+ 2013: (AUG, 8),
579
+ 2014: (JUL, 28),
580
+ 2015: (JUL, 17),
581
+ 2016: (JUL, 6),
582
+ 2017: (JUN, 25),
583
+ 2018: (JUN, 15),
584
+ 2019: (JUN, 5),
585
+ 2020: (MAY, 24),
586
+ 2021: (MAY, 13),
587
+ 2022: (MAY, 2),
588
+ 2023: (APR, 22),
600
589
  }
601
590
 
602
591
  HARI_HOL_JOHOR_DATES = {
603
- 2011: ((JAN, 12),),
592
+ 2011: (JAN, 12),
604
593
  2012: ((JAN, 1), (DEC, 20)),
605
- 2013: ((DEC, 10),),
606
- 2014: ((NOV, 29),),
607
- 2015: ((NOV, 19),),
608
- 2016: ((NOV, 7),),
609
- 2017: ((OCT, 27),),
610
- 2018: ((OCT, 15),),
611
- 2019: ((OCT, 5),),
612
- 2020: ((SEP, 24),),
613
- 2021: ((SEP, 13),),
614
- 2022: ((SEP, 3),),
594
+ 2013: (DEC, 10),
595
+ 2014: (NOV, 29),
596
+ 2015: (NOV, 19),
597
+ 2016: (NOV, 7),
598
+ 2017: (OCT, 27),
599
+ 2018: (OCT, 15),
600
+ 2019: (OCT, 5),
601
+ 2020: (SEP, 24),
602
+ 2021: (SEP, 13),
603
+ 2022: (SEP, 3),
615
604
  }
616
605
 
617
606
  HIJRI_NEW_YEAR_DATES = {
618
- 2001: ((MAR, 26),),
619
- 2002: ((MAR, 15),),
620
- 2003: ((MAR, 5),),
621
- 2004: ((FEB, 22),),
622
- 2005: ((FEB, 10),),
623
- 2006: ((JAN, 31),),
624
- 2007: ((JAN, 20),),
607
+ 2001: (MAR, 26),
608
+ 2002: (MAR, 15),
609
+ 2003: (MAR, 5),
610
+ 2004: (FEB, 22),
611
+ 2005: (FEB, 10),
612
+ 2006: (JAN, 31),
613
+ 2007: (JAN, 20),
625
614
  2008: ((JAN, 10), (DEC, 29)),
626
- 2009: ((DEC, 18),),
627
- 2010: ((DEC, 8),),
628
- 2011: ((NOV, 27),),
629
- 2012: ((NOV, 15),),
630
- 2013: ((NOV, 5),),
631
- 2014: ((OCT, 25),),
632
- 2015: ((OCT, 14),),
633
- 2016: ((OCT, 2),),
634
- 2017: ((SEP, 22),),
635
- 2018: ((SEP, 11),),
636
- 2019: ((SEP, 1),),
637
- 2020: ((AUG, 20),),
638
- 2021: ((AUG, 10),),
639
- 2022: ((JUL, 30),),
615
+ 2009: (DEC, 18),
616
+ 2010: (DEC, 8),
617
+ 2011: (NOV, 27),
618
+ 2012: (NOV, 15),
619
+ 2013: (NOV, 5),
620
+ 2014: (OCT, 25),
621
+ 2015: (OCT, 14),
622
+ 2016: (OCT, 2),
623
+ 2017: (SEP, 22),
624
+ 2018: (SEP, 11),
625
+ 2019: (SEP, 1),
626
+ 2020: (AUG, 20),
627
+ 2021: (AUG, 10),
628
+ 2022: (JUL, 30),
640
629
  }
641
630
 
642
631
  ISRA_AND_MIRAJ_DATES = {
643
- 2001: ((OCT, 15),),
644
- 2002: ((OCT, 4),),
645
- 2003: ((SEP, 24),),
646
- 2004: ((SEP, 12),),
647
- 2005: ((SEP, 1),),
648
- 2006: ((AUG, 22),),
649
- 2007: ((AUG, 11),),
650
- 2008: ((JUL, 31),),
651
- 2009: ((JUL, 20),),
652
- 2010: ((JUL, 9),),
653
- 2011: ((JUN, 29),),
654
- 2012: ((JUN, 17),),
655
- 2013: ((JUN, 6),),
656
- 2014: ((MAY, 27),),
657
- 2015: ((MAY, 16),),
658
- 2016: ((MAY, 5),),
659
- 2017: ((APR, 24),),
660
- 2018: ((APR, 14),),
661
- 2019: ((APR, 3),),
662
- 2020: ((MAR, 22),),
663
- 2021: ((MAR, 11),),
664
- 2022: ((MAR, 1),),
632
+ 2001: (OCT, 15),
633
+ 2002: (OCT, 4),
634
+ 2003: (SEP, 24),
635
+ 2004: (SEP, 12),
636
+ 2005: (SEP, 1),
637
+ 2006: (AUG, 22),
638
+ 2007: (AUG, 11),
639
+ 2008: (JUL, 31),
640
+ 2009: (JUL, 20),
641
+ 2010: (JUL, 9),
642
+ 2011: (JUN, 29),
643
+ 2012: (JUN, 17),
644
+ 2013: (JUN, 6),
645
+ 2014: (MAY, 27),
646
+ 2015: (MAY, 16),
647
+ 2016: (MAY, 5),
648
+ 2017: (APR, 24),
649
+ 2018: (APR, 14),
650
+ 2019: (APR, 3),
651
+ 2020: (MAR, 22),
652
+ 2021: (MAR, 11),
653
+ 2022: (MAR, 1),
654
+ 2023: (FEB, 18),
665
655
  }
666
656
 
667
657
  MAWLID_DATES = {
668
- 2001: ((JUN, 4),),
669
- 2002: ((MAY, 24),),
670
- 2003: ((MAY, 14),),
671
- 2004: ((MAY, 2),),
672
- 2005: ((APR, 21),),
673
- 2006: ((APR, 11),),
674
- 2007: ((MAR, 31),),
675
- 2008: ((MAR, 20),),
676
- 2009: ((MAR, 9),),
677
- 2010: ((FEB, 26),),
678
- 2011: ((FEB, 16),),
679
- 2012: ((FEB, 5),),
680
- 2013: ((JAN, 24),),
681
- 2014: ((JAN, 14),),
658
+ 2001: (JUN, 4),
659
+ 2002: (MAY, 24),
660
+ 2003: (MAY, 14),
661
+ 2004: (MAY, 2),
662
+ 2005: (APR, 21),
663
+ 2006: (APR, 11),
664
+ 2007: (MAR, 31),
665
+ 2008: (MAR, 20),
666
+ 2009: (MAR, 9),
667
+ 2010: (FEB, 26),
668
+ 2011: (FEB, 16),
669
+ 2012: (FEB, 5),
670
+ 2013: (JAN, 24),
671
+ 2014: (JAN, 14),
682
672
  2015: ((JAN, 3), (DEC, 24)),
683
- 2016: ((DEC, 12),),
684
- 2017: ((DEC, 1),),
685
- 2018: ((NOV, 20),),
686
- 2019: ((NOV, 9),),
687
- 2020: ((OCT, 29),),
688
- 2021: ((OCT, 19),),
689
- 2022: ((OCT, 10),),
673
+ 2016: (DEC, 12),
674
+ 2017: (DEC, 1),
675
+ 2018: (NOV, 20),
676
+ 2019: (NOV, 9),
677
+ 2020: (OCT, 29),
678
+ 2021: (OCT, 19),
679
+ 2022: (OCT, 10),
690
680
  }
691
681
  NUZUL_AL_QURAN_DATES = {
692
- 2001: ((DEC, 3),),
693
- 2002: ((NOV, 22),),
694
- 2003: ((NOV, 12),),
695
- 2004: ((NOV, 1),),
696
- 2005: ((OCT, 21),),
697
- 2006: ((OCT, 10),),
698
- 2007: ((SEP, 29),),
699
- 2008: ((SEP, 18),),
700
- 2009: ((SEP, 7),),
701
- 2010: ((AUG, 27),),
702
- 2011: ((AUG, 17),),
703
- 2012: ((AUG, 5),),
704
- 2013: ((JUL, 25),),
705
- 2014: ((JUL, 15),),
706
- 2015: ((JUL, 4),),
707
- 2016: ((JUN, 22),),
708
- 2017: ((JUN, 12),),
709
- 2018: ((JUN, 2),),
710
- 2019: ((MAY, 22),),
711
- 2020: ((MAY, 10),),
712
- 2021: ((APR, 29),),
713
- 2022: ((APR, 19),),
682
+ 2001: (DEC, 3),
683
+ 2002: (NOV, 22),
684
+ 2003: (NOV, 12),
685
+ 2004: (NOV, 1),
686
+ 2005: (OCT, 21),
687
+ 2006: (OCT, 10),
688
+ 2007: (SEP, 29),
689
+ 2008: (SEP, 18),
690
+ 2009: (SEP, 7),
691
+ 2010: (AUG, 27),
692
+ 2011: (AUG, 17),
693
+ 2012: (AUG, 5),
694
+ 2013: (JUL, 25),
695
+ 2014: (JUL, 15),
696
+ 2015: (JUL, 4),
697
+ 2016: (JUN, 22),
698
+ 2017: (JUN, 12),
699
+ 2018: (JUN, 2),
700
+ 2019: (MAY, 22),
701
+ 2020: (MAY, 10),
702
+ 2021: (APR, 29),
703
+ 2022: (APR, 19),
704
+ 2023: (APR, 8),
714
705
  }
715
706
 
716
707
  RAMADAN_BEGINNING_DATES = {
717
- 2001: ((NOV, 17),),
718
- 2002: ((NOV, 6),),
719
- 2003: ((OCT, 27),),
720
- 2004: ((OCT, 16),),
721
- 2005: ((OCT, 5),),
722
- 2006: ((SEP, 24),),
723
- 2007: ((SEP, 13),),
724
- 2008: ((SEP, 2),),
725
- 2009: ((AUG, 22),),
726
- 2010: ((AUG, 11),),
727
- 2011: ((AUG, 1),),
728
- 2012: ((JUL, 20),),
729
- 2013: ((JUL, 9),),
730
- 2014: ((JUN, 29),),
731
- 2015: ((JUN, 18),),
732
- 2016: ((JUN, 7),),
733
- 2017: ((MAY, 27),),
734
- 2018: ((MAY, 17),),
735
- 2019: ((MAY, 6),),
736
- 2020: ((APR, 24),),
737
- 2021: ((APR, 13),),
738
- 2022: ((APR, 3),),
708
+ 2001: (NOV, 17),
709
+ 2002: (NOV, 6),
710
+ 2003: (OCT, 27),
711
+ 2004: (OCT, 16),
712
+ 2005: (OCT, 5),
713
+ 2006: (SEP, 24),
714
+ 2007: (SEP, 13),
715
+ 2008: (SEP, 2),
716
+ 2009: (AUG, 22),
717
+ 2010: (AUG, 11),
718
+ 2011: (AUG, 1),
719
+ 2012: (JUL, 20),
720
+ 2013: (JUL, 9),
721
+ 2014: (JUN, 29),
722
+ 2015: (JUN, 18),
723
+ 2016: (JUN, 7),
724
+ 2017: (MAY, 27),
725
+ 2018: (MAY, 17),
726
+ 2019: (MAY, 6),
727
+ 2020: (APR, 24),
728
+ 2021: (APR, 13),
729
+ 2022: (APR, 3),
730
+ 2023: (MAR, 23),
739
731
  }