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
@@ -10,453 +10,1260 @@
10
10
  # License: MIT (see LICENSE file)
11
11
 
12
12
  from datetime import date
13
- from datetime import timedelta as td
14
- from functools import lru_cache
13
+ from typing import Optional, Tuple
15
14
 
15
+ from holidays.calendars.custom import _CustomCalendar
16
+ from holidays.constants import JAN, FEB, MAR, APR, MAY, JUN, SEP, OCT, NOV
16
17
 
17
- class _ChineseLuniSolar:
18
- def __init__(self) -> None:
19
- """
20
- This class has functions that generate Gregorian dates for holidays
21
- based on the Chinese lunisolar calendar.
18
+ BUDDHA_BIRTHDAY = "BUDDHA_BIRTHDAY"
19
+ DOUBLE_NINTH = "DOUBLE_NINTH"
20
+ DRAGON_BOAT = "DRAGON_BOAT"
21
+ HUNG_KINGS = "HUNG_KINGS"
22
+ LUNAR_NEW_YEAR = "LUNAR_NEW_YEAR"
23
+ MID_AUTUMN = "MID_AUTUMN"
22
24
 
23
- See `Wikipedia
24
- <https://en.wikipedia.org/wiki/Chinese_New_Year#Dates_in_Chinese_\
25
- lunisolar_calendar>`__
26
25
 
27
- Usage example:
26
+ class _ChineseLunisolar:
27
+ BUDDHA_BIRTHDAY_DATES = {
28
+ 1901: (MAY, 25),
29
+ 1902: (MAY, 15),
30
+ 1903: (MAY, 4),
31
+ 1904: (MAY, 22),
32
+ 1905: (MAY, 11),
33
+ 1906: (MAY, 1),
34
+ 1907: (MAY, 19),
35
+ 1908: (MAY, 7),
36
+ 1909: (MAY, 26),
37
+ 1910: (MAY, 16),
38
+ 1911: (MAY, 6),
39
+ 1912: (MAY, 24),
40
+ 1913: (MAY, 13),
41
+ 1914: (MAY, 2),
42
+ 1915: (MAY, 21),
43
+ 1916: (MAY, 9),
44
+ 1917: (MAY, 28),
45
+ 1918: (MAY, 17),
46
+ 1919: (MAY, 7),
47
+ 1920: (MAY, 25),
48
+ 1921: (MAY, 15),
49
+ 1922: (MAY, 4),
50
+ 1923: (MAY, 23),
51
+ 1924: (MAY, 11),
52
+ 1925: (APR, 30),
53
+ 1926: (MAY, 19),
54
+ 1927: (MAY, 8),
55
+ 1928: (MAY, 26),
56
+ 1929: (MAY, 16),
57
+ 1930: (MAY, 6),
58
+ 1931: (MAY, 24),
59
+ 1932: (MAY, 13),
60
+ 1933: (MAY, 2),
61
+ 1934: (MAY, 20),
62
+ 1935: (MAY, 10),
63
+ 1936: (MAY, 28),
64
+ 1937: (MAY, 17),
65
+ 1938: (MAY, 7),
66
+ 1939: (MAY, 26),
67
+ 1940: (MAY, 14),
68
+ 1941: (MAY, 3),
69
+ 1942: (MAY, 22),
70
+ 1943: (MAY, 11),
71
+ 1944: (APR, 30),
72
+ 1945: (MAY, 19),
73
+ 1946: (MAY, 8),
74
+ 1947: (MAY, 27),
75
+ 1948: (MAY, 16),
76
+ 1949: (MAY, 5),
77
+ 1950: (MAY, 24),
78
+ 1951: (MAY, 13),
79
+ 1952: (MAY, 1),
80
+ 1953: (MAY, 20),
81
+ 1954: (MAY, 10),
82
+ 1955: (MAY, 29),
83
+ 1956: (MAY, 17),
84
+ 1957: (MAY, 7),
85
+ 1958: (MAY, 26),
86
+ 1959: (MAY, 15),
87
+ 1960: (MAY, 3),
88
+ 1961: (MAY, 22),
89
+ 1962: (MAY, 11),
90
+ 1963: (MAY, 1),
91
+ 1964: (MAY, 19),
92
+ 1965: (MAY, 8),
93
+ 1966: (MAY, 27),
94
+ 1967: (MAY, 16),
95
+ 1968: (MAY, 4),
96
+ 1969: (MAY, 23),
97
+ 1970: (MAY, 12),
98
+ 1971: (MAY, 2),
99
+ 1972: (MAY, 20),
100
+ 1973: (MAY, 10),
101
+ 1974: (APR, 29),
102
+ 1975: (MAY, 18),
103
+ 1976: (MAY, 6),
104
+ 1977: (MAY, 25),
105
+ 1978: (MAY, 14),
106
+ 1979: (MAY, 3),
107
+ 1980: (MAY, 21),
108
+ 1981: (MAY, 11),
109
+ 1982: (MAY, 1),
110
+ 1983: (MAY, 20),
111
+ 1984: (MAY, 8),
112
+ 1985: (MAY, 27),
113
+ 1986: (MAY, 16),
114
+ 1987: (MAY, 5),
115
+ 1988: (MAY, 23),
116
+ 1989: (MAY, 12),
117
+ 1990: (MAY, 2),
118
+ 1991: (MAY, 21),
119
+ 1992: (MAY, 10),
120
+ 1993: (MAY, 28),
121
+ 1994: (MAY, 18),
122
+ 1995: (MAY, 7),
123
+ 1996: (MAY, 24),
124
+ 1997: (MAY, 14),
125
+ 1998: (MAY, 3),
126
+ 1999: (MAY, 22),
127
+ 2000: (MAY, 11),
128
+ 2001: (APR, 30),
129
+ 2002: (MAY, 19),
130
+ 2003: (MAY, 8),
131
+ 2004: (MAY, 26),
132
+ 2005: (MAY, 15),
133
+ 2006: (MAY, 5),
134
+ 2007: (MAY, 24),
135
+ 2008: (MAY, 12),
136
+ 2009: (MAY, 2),
137
+ 2010: (MAY, 21),
138
+ 2011: (MAY, 10),
139
+ 2012: (APR, 28),
140
+ 2013: (MAY, 17),
141
+ 2014: (MAY, 6),
142
+ 2015: (MAY, 25),
143
+ 2016: (MAY, 14),
144
+ 2017: (MAY, 3),
145
+ 2018: (MAY, 22),
146
+ 2019: (MAY, 12),
147
+ 2020: (APR, 30),
148
+ 2021: (MAY, 19),
149
+ 2022: (MAY, 8),
150
+ 2023: (MAY, 26),
151
+ 2024: (MAY, 15),
152
+ 2025: (MAY, 4),
153
+ 2026: (MAY, 24),
154
+ 2027: (MAY, 13),
155
+ 2028: (MAY, 2),
156
+ 2029: (MAY, 20),
157
+ 2030: (MAY, 9),
158
+ 2031: (MAY, 28),
159
+ 2032: (MAY, 16),
160
+ 2033: (MAY, 6),
161
+ 2034: (MAY, 25),
162
+ 2035: (MAY, 15),
163
+ 2036: (MAY, 3),
164
+ 2037: (MAY, 22),
165
+ 2038: (MAY, 11),
166
+ 2039: (APR, 30),
167
+ 2040: (MAY, 18),
168
+ 2041: (MAY, 7),
169
+ 2042: (MAY, 26),
170
+ 2043: (MAY, 16),
171
+ 2044: (MAY, 5),
172
+ 2045: (MAY, 24),
173
+ 2046: (MAY, 13),
174
+ 2047: (MAY, 2),
175
+ 2048: (MAY, 20),
176
+ 2049: (MAY, 9),
177
+ 2050: (MAY, 28),
178
+ 2051: (MAY, 17),
179
+ 2052: (MAY, 6),
180
+ 2053: (MAY, 25),
181
+ 2054: (MAY, 15),
182
+ 2055: (MAY, 4),
183
+ 2056: (MAY, 22),
184
+ 2057: (MAY, 11),
185
+ 2058: (APR, 30),
186
+ 2059: (MAY, 19),
187
+ 2060: (MAY, 7),
188
+ 2061: (MAY, 26),
189
+ 2062: (MAY, 16),
190
+ 2063: (MAY, 5),
191
+ 2064: (MAY, 23),
192
+ 2065: (MAY, 12),
193
+ 2066: (MAY, 1),
194
+ 2067: (MAY, 20),
195
+ 2068: (MAY, 9),
196
+ 2069: (APR, 28),
197
+ 2070: (MAY, 17),
198
+ 2071: (MAY, 7),
199
+ 2072: (MAY, 25),
200
+ 2073: (MAY, 14),
201
+ 2074: (MAY, 3),
202
+ 2075: (MAY, 22),
203
+ 2076: (MAY, 10),
204
+ 2077: (APR, 30),
205
+ 2078: (MAY, 19),
206
+ 2079: (MAY, 8),
207
+ 2080: (MAY, 26),
208
+ 2081: (MAY, 16),
209
+ 2082: (MAY, 5),
210
+ 2083: (MAY, 24),
211
+ 2084: (MAY, 12),
212
+ 2085: (MAY, 1),
213
+ 2086: (MAY, 20),
214
+ 2087: (MAY, 10),
215
+ 2088: (APR, 28),
216
+ 2089: (MAY, 17),
217
+ 2090: (MAY, 7),
218
+ 2091: (MAY, 25),
219
+ 2092: (MAY, 13),
220
+ 2093: (MAY, 3),
221
+ 2094: (MAY, 21),
222
+ 2095: (MAY, 11),
223
+ 2096: (APR, 30),
224
+ 2097: (MAY, 19),
225
+ 2098: (MAY, 8),
226
+ 2099: (MAY, 27),
227
+ }
28
228
 
29
- >>> from holidays.calendars import _ChineseLuniSolar
30
- >>> cnls = _ChineseLuniSolar()
31
- >>> print(cnls.lunar_n_y_date(2010))
32
- 2010-02-14
33
- """
229
+ DOUBLE_NINTH_DATES = {
230
+ 1901: (OCT, 20),
231
+ 1902: (OCT, 10),
232
+ 1903: (OCT, 28),
233
+ 1904: (OCT, 17),
234
+ 1905: (OCT, 7),
235
+ 1906: (OCT, 26),
236
+ 1907: (OCT, 15),
237
+ 1908: (OCT, 3),
238
+ 1909: (OCT, 22),
239
+ 1910: (OCT, 11),
240
+ 1911: (OCT, 30),
241
+ 1912: (OCT, 18),
242
+ 1913: (OCT, 8),
243
+ 1914: (OCT, 27),
244
+ 1915: (OCT, 17),
245
+ 1916: (OCT, 5),
246
+ 1917: (OCT, 24),
247
+ 1918: (OCT, 13),
248
+ 1919: (NOV, 1),
249
+ 1920: (OCT, 20),
250
+ 1921: (OCT, 9),
251
+ 1922: (OCT, 28),
252
+ 1923: (OCT, 18),
253
+ 1924: (OCT, 7),
254
+ 1925: (OCT, 26),
255
+ 1926: (OCT, 15),
256
+ 1927: (OCT, 4),
257
+ 1928: (OCT, 21),
258
+ 1929: (OCT, 11),
259
+ 1930: (OCT, 30),
260
+ 1931: (OCT, 19),
261
+ 1932: (OCT, 8),
262
+ 1933: (OCT, 27),
263
+ 1934: (OCT, 16),
264
+ 1935: (OCT, 6),
265
+ 1936: (OCT, 23),
266
+ 1937: (OCT, 12),
267
+ 1938: (OCT, 31),
268
+ 1939: (OCT, 21),
269
+ 1940: (OCT, 9),
270
+ 1941: (OCT, 28),
271
+ 1942: (OCT, 18),
272
+ 1943: (OCT, 7),
273
+ 1944: (OCT, 25),
274
+ 1945: (OCT, 14),
275
+ 1946: (OCT, 3),
276
+ 1947: (OCT, 22),
277
+ 1948: (OCT, 11),
278
+ 1949: (OCT, 30),
279
+ 1950: (OCT, 19),
280
+ 1951: (OCT, 9),
281
+ 1952: (OCT, 27),
282
+ 1953: (OCT, 16),
283
+ 1954: (OCT, 5),
284
+ 1955: (OCT, 24),
285
+ 1956: (OCT, 12),
286
+ 1957: (OCT, 31),
287
+ 1958: (OCT, 21),
288
+ 1959: (OCT, 10),
289
+ 1960: (OCT, 28),
290
+ 1961: (OCT, 18),
291
+ 1962: (OCT, 7),
292
+ 1963: (OCT, 25),
293
+ 1964: (OCT, 14),
294
+ 1965: (OCT, 3),
295
+ 1966: (OCT, 22),
296
+ 1967: (OCT, 12),
297
+ 1968: (OCT, 30),
298
+ 1969: (OCT, 19),
299
+ 1970: (OCT, 8),
300
+ 1971: (OCT, 27),
301
+ 1972: (OCT, 15),
302
+ 1973: (OCT, 4),
303
+ 1974: (OCT, 23),
304
+ 1975: (OCT, 13),
305
+ 1976: (OCT, 31),
306
+ 1977: (OCT, 21),
307
+ 1978: (OCT, 10),
308
+ 1979: (OCT, 29),
309
+ 1980: (OCT, 17),
310
+ 1981: (OCT, 6),
311
+ 1982: (OCT, 25),
312
+ 1983: (OCT, 14),
313
+ 1984: (OCT, 3),
314
+ 1985: (OCT, 22),
315
+ 1986: (OCT, 12),
316
+ 1987: (OCT, 31),
317
+ 1988: (OCT, 19),
318
+ 1989: (OCT, 8),
319
+ 1990: (OCT, 26),
320
+ 1991: (OCT, 16),
321
+ 1992: (OCT, 4),
322
+ 1993: (OCT, 23),
323
+ 1994: (OCT, 13),
324
+ 1995: (NOV, 1),
325
+ 1996: (OCT, 20),
326
+ 1997: (OCT, 10),
327
+ 1998: (OCT, 28),
328
+ 1999: (OCT, 17),
329
+ 2000: (OCT, 6),
330
+ 2001: (OCT, 25),
331
+ 2002: (OCT, 14),
332
+ 2003: (OCT, 4),
333
+ 2004: (OCT, 22),
334
+ 2005: (OCT, 11),
335
+ 2006: (OCT, 30),
336
+ 2007: (OCT, 19),
337
+ 2008: (OCT, 7),
338
+ 2009: (OCT, 26),
339
+ 2010: (OCT, 16),
340
+ 2011: (OCT, 5),
341
+ 2012: (OCT, 23),
342
+ 2013: (OCT, 13),
343
+ 2014: (OCT, 2),
344
+ 2015: (OCT, 21),
345
+ 2016: (OCT, 9),
346
+ 2017: (OCT, 28),
347
+ 2018: (OCT, 17),
348
+ 2019: (OCT, 7),
349
+ 2020: (OCT, 25),
350
+ 2021: (OCT, 14),
351
+ 2022: (OCT, 4),
352
+ 2023: (OCT, 23),
353
+ 2024: (OCT, 11),
354
+ 2025: (OCT, 29),
355
+ 2026: (OCT, 18),
356
+ 2027: (OCT, 8),
357
+ 2028: (OCT, 26),
358
+ 2029: (OCT, 16),
359
+ 2030: (OCT, 5),
360
+ 2031: (OCT, 24),
361
+ 2032: (OCT, 12),
362
+ 2033: (OCT, 1),
363
+ 2034: (OCT, 20),
364
+ 2035: (OCT, 9),
365
+ 2036: (OCT, 27),
366
+ 2037: (OCT, 17),
367
+ 2038: (OCT, 7),
368
+ 2039: (OCT, 26),
369
+ 2040: (OCT, 14),
370
+ 2041: (OCT, 3),
371
+ 2042: (OCT, 22),
372
+ 2043: (OCT, 11),
373
+ 2044: (OCT, 29),
374
+ 2045: (OCT, 18),
375
+ 2046: (OCT, 8),
376
+ 2047: (OCT, 27),
377
+ 2048: (OCT, 16),
378
+ 2049: (OCT, 5),
379
+ 2050: (OCT, 24),
380
+ 2051: (OCT, 13),
381
+ 2052: (OCT, 30),
382
+ 2053: (OCT, 20),
383
+ 2054: (OCT, 9),
384
+ 2055: (OCT, 28),
385
+ 2056: (OCT, 17),
386
+ 2057: (OCT, 7),
387
+ 2058: (OCT, 25),
388
+ 2059: (OCT, 14),
389
+ 2060: (OCT, 2),
390
+ 2061: (OCT, 21),
391
+ 2062: (OCT, 11),
392
+ 2063: (OCT, 30),
393
+ 2064: (OCT, 18),
394
+ 2065: (OCT, 8),
395
+ 2066: (OCT, 27),
396
+ 2067: (OCT, 16),
397
+ 2068: (OCT, 4),
398
+ 2069: (OCT, 23),
399
+ 2070: (OCT, 12),
400
+ 2071: (OCT, 31),
401
+ 2072: (OCT, 20),
402
+ 2073: (OCT, 9),
403
+ 2074: (OCT, 28),
404
+ 2075: (OCT, 18),
405
+ 2076: (OCT, 6),
406
+ 2077: (OCT, 25),
407
+ 2078: (OCT, 14),
408
+ 2079: (OCT, 3),
409
+ 2080: (OCT, 21),
410
+ 2081: (OCT, 11),
411
+ 2082: (OCT, 30),
412
+ 2083: (OCT, 19),
413
+ 2084: (OCT, 8),
414
+ 2085: (OCT, 27),
415
+ 2086: (OCT, 16),
416
+ 2087: (OCT, 5),
417
+ 2088: (OCT, 22),
418
+ 2089: (OCT, 12),
419
+ 2090: (OCT, 31),
420
+ 2091: (OCT, 21),
421
+ 2092: (OCT, 9),
422
+ 2093: (OCT, 28),
423
+ 2094: (OCT, 17),
424
+ 2095: (OCT, 6),
425
+ 2096: (OCT, 24),
426
+ 2097: (OCT, 13),
427
+ 2098: (OCT, 3),
428
+ 2099: (OCT, 22),
429
+ }
34
430
 
35
- # A binary representation starting from year 1901 of the number of
36
- # days per year, and the number of days from the 1st to the 13th to
37
- # store the monthly (including the month of the month). 1 means that
38
- # the month is 30 days. 0 means the month is 29 days.
39
- # The 12th to 15th digits indicate the month of the next month.
40
- # If it is 0x0F, it means that there is no leap month.
41
- self.G_LUNAR_MONTH_DAYS = [
42
- 0xF0EA4, # 1901
43
- 0xF1D4A,
44
- 0x52C94,
45
- 0xF0C96,
46
- 0xF1536,
47
- 0x42AAC,
48
- 0xF0AD4,
49
- 0xF16B2,
50
- 0x22EA4,
51
- 0xF0EA4, # 1911
52
- 0x6364A,
53
- 0xF164A,
54
- 0xF1496,
55
- 0x52956,
56
- 0xF055A,
57
- 0xF0AD6,
58
- 0x216D2,
59
- 0xF1B52,
60
- 0x73B24,
61
- 0xF1D24, # 1921
62
- 0xF1A4A,
63
- 0x5349A,
64
- 0xF14AC,
65
- 0xF056C,
66
- 0x42B6A,
67
- 0xF0DA8,
68
- 0xF1D52,
69
- 0x23D24,
70
- 0xF1D24,
71
- 0x61A4C, # 1931
72
- 0xF0A56,
73
- 0xF14AE,
74
- 0x5256C,
75
- 0xF16B4,
76
- 0xF0DA8,
77
- 0x31D92,
78
- 0xF0E92,
79
- 0x72D26,
80
- 0xF1526,
81
- 0xF0A56, # 1941
82
- 0x614B6,
83
- 0xF155A,
84
- 0xF0AD4,
85
- 0x436AA,
86
- 0xF1748,
87
- 0xF1692,
88
- 0x23526,
89
- 0xF152A,
90
- 0x72A5A,
91
- 0xF0A6C, # 1951
92
- 0xF155A,
93
- 0x52B54,
94
- 0xF0B64,
95
- 0xF1B4A,
96
- 0x33A94,
97
- 0xF1A94,
98
- 0x8152A,
99
- 0xF152E,
100
- 0xF0AAC,
101
- 0x6156A, # 1961
102
- 0xF15AA,
103
- 0xF0DA4,
104
- 0x41D4A,
105
- 0xF1D4A,
106
- 0xF0C94,
107
- 0x3192E,
108
- 0xF1536,
109
- 0x72AB4,
110
- 0xF0AD4,
111
- 0xF16D2, # 1971
112
- 0x52EA4,
113
- 0xF16A4,
114
- 0xF164A,
115
- 0x42C96,
116
- 0xF1496,
117
- 0x82956,
118
- 0xF055A,
119
- 0xF0ADA,
120
- 0x616D2,
121
- 0xF1B52, # 1981
122
- 0xF1B24,
123
- 0x43A4A,
124
- 0xF1A4A,
125
- 0xA349A,
126
- 0xF14AC,
127
- 0xF056C,
128
- 0x60B6A,
129
- 0xF0DAA,
130
- 0xF1D92,
131
- 0x53D24, # 1991
132
- 0xF1D24,
133
- 0xF1A4C,
134
- 0x314AC,
135
- 0xF14AE,
136
- 0x829AC,
137
- 0xF06B4,
138
- 0xF0DAA,
139
- 0x52D92,
140
- 0xF0E92,
141
- 0xF0D26, # 2001
142
- 0x42A56,
143
- 0xF0A56,
144
- 0xF14B6,
145
- 0x22AB4,
146
- 0xF0AD4,
147
- 0x736AA,
148
- 0xF1748,
149
- 0xF1692,
150
- 0x53526,
151
- 0xF152A, # 2011
152
- 0xF0A5A,
153
- 0x4155A,
154
- 0xF156A,
155
- 0x92B54,
156
- 0xF0BA4,
157
- 0xF1B4A,
158
- 0x63A94,
159
- 0xF1A94,
160
- 0xF192A,
161
- 0x42A5C, # 2021
162
- 0xF0AAC,
163
- 0xF156A,
164
- 0x22B64,
165
- 0xF0DA4,
166
- 0x61D52,
167
- 0xF0E4A,
168
- 0xF0C96,
169
- 0x5192E,
170
- 0xF1956,
171
- 0xF0AB4, # 2031
172
- 0x315AC,
173
- 0xF16D2,
174
- 0xB2EA4,
175
- 0xF16A4,
176
- 0xF164A,
177
- 0x63496,
178
- 0xF1496,
179
- 0xF0956,
180
- 0x50AB6,
181
- 0xF0B5A, # 2041
182
- 0xF16D4,
183
- 0x236A4,
184
- 0xF1B24,
185
- 0x73A4A,
186
- 0xF1A4A,
187
- 0xF14AA,
188
- 0x5295A,
189
- 0xF096C,
190
- 0xF0B6A,
191
- 0x31B54, # 2051
192
- 0xF1D92,
193
- 0x83D24,
194
- 0xF1D24,
195
- 0xF1A4C,
196
- 0x614AC,
197
- 0xF14AE,
198
- 0xF09AC,
199
- 0x40DAA,
200
- 0xF0EAA,
201
- 0xF0E92, # 2061
202
- 0x31D26,
203
- 0xF0D26,
204
- 0x72A56,
205
- 0xF0A56,
206
- 0xF14B6,
207
- 0x52AB4,
208
- 0xF0AD4,
209
- 0xF16CA,
210
- 0x42E94,
211
- 0xF1694, # 2071
212
- 0x8352A,
213
- 0xF152A,
214
- 0xF0A5A,
215
- 0x6155A,
216
- 0xF156A,
217
- 0xF0B54,
218
- 0x4174A,
219
- 0xF1B4A,
220
- 0xF1A94,
221
- 0x3392A, # 2081
222
- 0xF192C,
223
- 0x7329C,
224
- 0xF0AAC,
225
- 0xF156A,
226
- 0x52B64,
227
- 0xF0DA4,
228
- 0xF1D4A,
229
- 0x41C94,
230
- 0xF0C96,
231
- 0x8192E, # 2091
232
- 0xF0956,
233
- 0xF0AB6,
234
- 0x615AC,
235
- 0xF16D4,
236
- 0xF0EA4,
237
- 0x42E4A,
238
- 0xF164A,
239
- 0xF1516,
240
- 0x22936, # 2100
241
- ]
242
- # Define range of years covered
243
- self.START_YEAR = 1901
244
- self.END_YEAR = 2099
245
- # The 1st day of the 1st month of the Gregorian calendar is 1901/2/19
246
- self.LUNAR_START_DATE = ((1901, 1, 1),)
247
- self.SOLAR_START_DATE = date(1901, 2, 19)
248
- # The Gregorian date for December 30, 2099 is 2100/2/8
249
- self.LUNAR_END_DATE = (2099, 12, 30)
250
- self.SOLAR_END_DATE = date(2100, 2, 18)
431
+ DRAGON_BOAT_DATES = {
432
+ 1901: (JUN, 20),
433
+ 1902: (JUN, 10),
434
+ 1903: (MAY, 31),
435
+ 1904: (JUN, 18),
436
+ 1905: (JUN, 7),
437
+ 1906: (JUN, 26),
438
+ 1907: (JUN, 15),
439
+ 1908: (JUN, 3),
440
+ 1909: (JUN, 22),
441
+ 1910: (JUN, 11),
442
+ 1911: (JUN, 1),
443
+ 1912: (JUN, 19),
444
+ 1913: (JUN, 9),
445
+ 1914: (MAY, 29),
446
+ 1915: (JUN, 17),
447
+ 1916: (JUN, 5),
448
+ 1917: (JUN, 23),
449
+ 1918: (JUN, 13),
450
+ 1919: (JUN, 2),
451
+ 1920: (JUN, 20),
452
+ 1921: (JUN, 10),
453
+ 1922: (MAY, 31),
454
+ 1923: (JUN, 18),
455
+ 1924: (JUN, 6),
456
+ 1925: (JUN, 25),
457
+ 1926: (JUN, 14),
458
+ 1927: (JUN, 4),
459
+ 1928: (JUN, 22),
460
+ 1929: (JUN, 11),
461
+ 1930: (JUN, 1),
462
+ 1931: (JUN, 20),
463
+ 1932: (JUN, 8),
464
+ 1933: (MAY, 28),
465
+ 1934: (JUN, 16),
466
+ 1935: (JUN, 5),
467
+ 1936: (JUN, 23),
468
+ 1937: (JUN, 13),
469
+ 1938: (JUN, 2),
470
+ 1939: (JUN, 21),
471
+ 1940: (JUN, 10),
472
+ 1941: (MAY, 30),
473
+ 1942: (JUN, 18),
474
+ 1943: (JUN, 7),
475
+ 1944: (JUN, 25),
476
+ 1945: (JUN, 14),
477
+ 1946: (JUN, 4),
478
+ 1947: (JUN, 23),
479
+ 1948: (JUN, 11),
480
+ 1949: (JUN, 1),
481
+ 1950: (JUN, 19),
482
+ 1951: (JUN, 9),
483
+ 1952: (MAY, 28),
484
+ 1953: (JUN, 15),
485
+ 1954: (JUN, 5),
486
+ 1955: (JUN, 24),
487
+ 1956: (JUN, 13),
488
+ 1957: (JUN, 2),
489
+ 1958: (JUN, 21),
490
+ 1959: (JUN, 10),
491
+ 1960: (MAY, 29),
492
+ 1961: (JUN, 17),
493
+ 1962: (JUN, 6),
494
+ 1963: (JUN, 25),
495
+ 1964: (JUN, 14),
496
+ 1965: (JUN, 4),
497
+ 1966: (JUN, 23),
498
+ 1967: (JUN, 12),
499
+ 1968: (MAY, 31),
500
+ 1969: (JUN, 19),
501
+ 1970: (JUN, 8),
502
+ 1971: (MAY, 28),
503
+ 1972: (JUN, 15),
504
+ 1973: (JUN, 5),
505
+ 1974: (JUN, 24),
506
+ 1975: (JUN, 14),
507
+ 1976: (JUN, 2),
508
+ 1977: (JUN, 21),
509
+ 1978: (JUN, 10),
510
+ 1979: (MAY, 30),
511
+ 1980: (JUN, 17),
512
+ 1981: (JUN, 6),
513
+ 1982: (JUN, 25),
514
+ 1983: (JUN, 15),
515
+ 1984: (JUN, 4),
516
+ 1985: (JUN, 22),
517
+ 1986: (JUN, 11),
518
+ 1987: (MAY, 31),
519
+ 1988: (JUN, 18),
520
+ 1989: (JUN, 8),
521
+ 1990: (MAY, 28),
522
+ 1991: (JUN, 16),
523
+ 1992: (JUN, 5),
524
+ 1993: (JUN, 24),
525
+ 1994: (JUN, 13),
526
+ 1995: (JUN, 2),
527
+ 1996: (JUN, 20),
528
+ 1997: (JUN, 9),
529
+ 1998: (MAY, 30),
530
+ 1999: (JUN, 18),
531
+ 2000: (JUN, 6),
532
+ 2001: (JUN, 25),
533
+ 2002: (JUN, 15),
534
+ 2003: (JUN, 4),
535
+ 2004: (JUN, 22),
536
+ 2005: (JUN, 11),
537
+ 2006: (MAY, 31),
538
+ 2007: (JUN, 19),
539
+ 2008: (JUN, 8),
540
+ 2009: (MAY, 28),
541
+ 2010: (JUN, 16),
542
+ 2011: (JUN, 6),
543
+ 2012: (JUN, 23),
544
+ 2013: (JUN, 12),
545
+ 2014: (JUN, 2),
546
+ 2015: (JUN, 20),
547
+ 2016: (JUN, 9),
548
+ 2017: (MAY, 30),
549
+ 2018: (JUN, 18),
550
+ 2019: (JUN, 7),
551
+ 2020: (JUN, 25),
552
+ 2021: (JUN, 14),
553
+ 2022: (JUN, 3),
554
+ 2023: (JUN, 22),
555
+ 2024: (JUN, 10),
556
+ 2025: (MAY, 31),
557
+ 2026: (JUN, 19),
558
+ 2027: (JUN, 9),
559
+ 2028: (MAY, 28),
560
+ 2029: (JUN, 16),
561
+ 2030: (JUN, 5),
562
+ 2031: (JUN, 24),
563
+ 2032: (JUN, 12),
564
+ 2033: (JUN, 1),
565
+ 2034: (JUN, 20),
566
+ 2035: (JUN, 10),
567
+ 2036: (MAY, 30),
568
+ 2037: (JUN, 18),
569
+ 2038: (JUN, 7),
570
+ 2039: (MAY, 27),
571
+ 2040: (JUN, 14),
572
+ 2041: (JUN, 3),
573
+ 2042: (JUN, 22),
574
+ 2043: (JUN, 11),
575
+ 2044: (MAY, 31),
576
+ 2045: (JUN, 19),
577
+ 2046: (JUN, 8),
578
+ 2047: (MAY, 29),
579
+ 2048: (JUN, 15),
580
+ 2049: (JUN, 4),
581
+ 2050: (JUN, 23),
582
+ 2051: (JUN, 13),
583
+ 2052: (JUN, 1),
584
+ 2053: (JUN, 20),
585
+ 2054: (JUN, 10),
586
+ 2055: (MAY, 30),
587
+ 2056: (JUN, 17),
588
+ 2057: (JUN, 6),
589
+ 2058: (JUN, 25),
590
+ 2059: (JUN, 14),
591
+ 2060: (JUN, 3),
592
+ 2061: (JUN, 22),
593
+ 2062: (JUN, 11),
594
+ 2063: (JUN, 1),
595
+ 2064: (JUN, 19),
596
+ 2065: (JUN, 8),
597
+ 2066: (MAY, 28),
598
+ 2067: (JUN, 16),
599
+ 2068: (JUN, 4),
600
+ 2069: (JUN, 23),
601
+ 2070: (JUN, 13),
602
+ 2071: (JUN, 2),
603
+ 2072: (JUN, 20),
604
+ 2073: (JUN, 10),
605
+ 2074: (MAY, 30),
606
+ 2075: (JUN, 17),
607
+ 2076: (JUN, 6),
608
+ 2077: (JUN, 24),
609
+ 2078: (JUN, 14),
610
+ 2079: (JUN, 4),
611
+ 2080: (JUN, 22),
612
+ 2081: (JUN, 11),
613
+ 2082: (JUN, 1),
614
+ 2083: (JUN, 19),
615
+ 2084: (JUN, 7),
616
+ 2085: (MAY, 27),
617
+ 2086: (JUN, 15),
618
+ 2087: (JUN, 5),
619
+ 2088: (JUN, 23),
620
+ 2089: (JUN, 13),
621
+ 2090: (JUN, 2),
622
+ 2091: (JUN, 21),
623
+ 2092: (JUN, 9),
624
+ 2093: (MAY, 29),
625
+ 2094: (JUN, 17),
626
+ 2095: (JUN, 6),
627
+ 2096: (JUN, 24),
628
+ 2097: (JUN, 14),
629
+ 2098: (JUN, 4),
630
+ 2099: (JUN, 23),
631
+ }
251
632
 
252
- @lru_cache()
253
- def _get_leap_month(self, lunar_year: int) -> int:
254
- """
255
- Calculate the leap lunar month in a lunar year.
633
+ HUNG_KINGS_DATES = {
634
+ 1901: (APR, 28),
635
+ 1902: (APR, 17),
636
+ 1903: (APR, 7),
637
+ 1904: (APR, 25),
638
+ 1905: (APR, 14),
639
+ 1906: (APR, 3),
640
+ 1907: (APR, 22),
641
+ 1908: (APR, 10),
642
+ 1909: (APR, 29),
643
+ 1910: (APR, 19),
644
+ 1911: (APR, 8),
645
+ 1912: (APR, 26),
646
+ 1913: (APR, 16),
647
+ 1914: (APR, 5),
648
+ 1915: (APR, 23),
649
+ 1916: (APR, 12),
650
+ 1917: (APR, 30),
651
+ 1918: (APR, 20),
652
+ 1919: (APR, 10),
653
+ 1920: (APR, 28),
654
+ 1921: (APR, 17),
655
+ 1922: (APR, 6),
656
+ 1923: (APR, 25),
657
+ 1924: (APR, 13),
658
+ 1925: (APR, 2),
659
+ 1926: (APR, 21),
660
+ 1927: (APR, 11),
661
+ 1928: (APR, 29),
662
+ 1929: (APR, 19),
663
+ 1930: (APR, 8),
664
+ 1931: (APR, 27),
665
+ 1932: (APR, 15),
666
+ 1933: (APR, 4),
667
+ 1934: (APR, 23),
668
+ 1935: (APR, 12),
669
+ 1936: (APR, 1),
670
+ 1937: (APR, 20),
671
+ 1938: (APR, 10),
672
+ 1939: (APR, 29),
673
+ 1940: (APR, 17),
674
+ 1941: (APR, 6),
675
+ 1942: (APR, 24),
676
+ 1943: (APR, 14),
677
+ 1944: (APR, 2),
678
+ 1945: (APR, 21),
679
+ 1946: (APR, 11),
680
+ 1947: (APR, 30),
681
+ 1948: (APR, 18),
682
+ 1949: (APR, 7),
683
+ 1950: (APR, 26),
684
+ 1951: (APR, 15),
685
+ 1952: (APR, 4),
686
+ 1953: (APR, 23),
687
+ 1954: (APR, 12),
688
+ 1955: (APR, 2),
689
+ 1956: (APR, 20),
690
+ 1957: (APR, 9),
691
+ 1958: (APR, 28),
692
+ 1959: (APR, 17),
693
+ 1960: (APR, 5),
694
+ 1961: (APR, 24),
695
+ 1962: (APR, 14),
696
+ 1963: (APR, 3),
697
+ 1964: (APR, 21),
698
+ 1965: (APR, 11),
699
+ 1966: (MAR, 31),
700
+ 1967: (APR, 19),
701
+ 1968: (APR, 7),
702
+ 1969: (APR, 26),
703
+ 1970: (APR, 15),
704
+ 1971: (APR, 5),
705
+ 1972: (APR, 23),
706
+ 1973: (APR, 12),
707
+ 1974: (APR, 2),
708
+ 1975: (APR, 21),
709
+ 1976: (APR, 9),
710
+ 1977: (APR, 27),
711
+ 1978: (APR, 16),
712
+ 1979: (APR, 6),
713
+ 1980: (APR, 24),
714
+ 1981: (APR, 14),
715
+ 1982: (APR, 3),
716
+ 1983: (APR, 22),
717
+ 1984: (APR, 10),
718
+ 1985: (APR, 29),
719
+ 1986: (APR, 18),
720
+ 1987: (APR, 7),
721
+ 1988: (APR, 25),
722
+ 1989: (APR, 15),
723
+ 1990: (APR, 5),
724
+ 1991: (APR, 24),
725
+ 1992: (APR, 12),
726
+ 1993: (APR, 1),
727
+ 1994: (APR, 20),
728
+ 1995: (APR, 9),
729
+ 1996: (APR, 27),
730
+ 1997: (APR, 16),
731
+ 1998: (APR, 6),
732
+ 1999: (APR, 25),
733
+ 2000: (APR, 14),
734
+ 2001: (APR, 3),
735
+ 2002: (APR, 22),
736
+ 2003: (APR, 11),
737
+ 2004: (APR, 28),
738
+ 2005: (APR, 18),
739
+ 2006: (APR, 7),
740
+ 2007: (APR, 26),
741
+ 2008: (APR, 15),
742
+ 2009: (APR, 5),
743
+ 2010: (APR, 23),
744
+ 2011: (APR, 12),
745
+ 2012: (MAR, 31),
746
+ 2013: (APR, 19),
747
+ 2014: (APR, 9),
748
+ 2015: (APR, 28),
749
+ 2016: (APR, 16),
750
+ 2017: (APR, 6),
751
+ 2018: (APR, 25),
752
+ 2019: (APR, 14),
753
+ 2020: (APR, 2),
754
+ 2021: (APR, 21),
755
+ 2022: (APR, 10),
756
+ 2023: (APR, 29),
757
+ 2024: (APR, 18),
758
+ 2025: (APR, 7),
759
+ 2026: (APR, 26),
760
+ 2027: (APR, 16),
761
+ 2028: (APR, 4),
762
+ 2029: (APR, 23),
763
+ 2030: (APR, 12),
764
+ 2031: (APR, 1),
765
+ 2032: (APR, 19),
766
+ 2033: (APR, 9),
767
+ 2034: (APR, 28),
768
+ 2035: (APR, 17),
769
+ 2036: (APR, 6),
770
+ 2037: (APR, 25),
771
+ 2038: (APR, 14),
772
+ 2039: (APR, 3),
773
+ 2040: (APR, 20),
774
+ 2041: (APR, 10),
775
+ 2042: (APR, 29),
776
+ 2043: (APR, 19),
777
+ 2044: (APR, 7),
778
+ 2045: (APR, 26),
779
+ 2046: (APR, 15),
780
+ 2047: (APR, 4),
781
+ 2048: (APR, 22),
782
+ 2049: (APR, 11),
783
+ 2050: (APR, 1),
784
+ 2051: (APR, 20),
785
+ 2052: (APR, 9),
786
+ 2053: (APR, 28),
787
+ 2054: (APR, 17),
788
+ 2055: (APR, 6),
789
+ 2056: (APR, 24),
790
+ 2057: (APR, 13),
791
+ 2058: (APR, 2),
792
+ 2059: (APR, 21),
793
+ 2060: (APR, 10),
794
+ 2061: (MAR, 31),
795
+ 2062: (APR, 19),
796
+ 2063: (APR, 8),
797
+ 2064: (APR, 26),
798
+ 2065: (APR, 15),
799
+ 2066: (APR, 4),
800
+ 2067: (APR, 23),
801
+ 2068: (APR, 11),
802
+ 2069: (APR, 1),
803
+ 2070: (APR, 20),
804
+ 2071: (APR, 9),
805
+ 2072: (APR, 27),
806
+ 2073: (APR, 16),
807
+ 2074: (APR, 5),
808
+ 2075: (APR, 24),
809
+ 2076: (APR, 13),
810
+ 2077: (APR, 2),
811
+ 2078: (APR, 21),
812
+ 2079: (APR, 11),
813
+ 2080: (MAR, 30),
814
+ 2081: (APR, 18),
815
+ 2082: (APR, 7),
816
+ 2083: (APR, 26),
817
+ 2084: (APR, 14),
818
+ 2085: (APR, 4),
819
+ 2086: (APR, 23),
820
+ 2087: (APR, 12),
821
+ 2088: (APR, 1),
822
+ 2089: (APR, 20),
823
+ 2090: (APR, 9),
824
+ 2091: (APR, 28),
825
+ 2092: (APR, 16),
826
+ 2093: (APR, 5),
827
+ 2094: (APR, 24),
828
+ 2095: (APR, 14),
829
+ 2096: (APR, 2),
830
+ 2097: (APR, 21),
831
+ 2098: (APR, 11),
832
+ 2099: (APR, 29),
833
+ }
256
834
 
257
- :param lunar_year:
258
- The lunar year.
835
+ LUNAR_NEW_YEAR_DATES = {
836
+ 1901: (FEB, 19),
837
+ 1902: (FEB, 8),
838
+ 1903: (JAN, 29),
839
+ 1904: (FEB, 16),
840
+ 1905: (FEB, 4),
841
+ 1906: (JAN, 25),
842
+ 1907: (FEB, 13),
843
+ 1908: (FEB, 2),
844
+ 1909: (JAN, 22),
845
+ 1910: (FEB, 10),
846
+ 1911: (JAN, 30),
847
+ 1912: (FEB, 18),
848
+ 1913: (FEB, 6),
849
+ 1914: (JAN, 26),
850
+ 1915: (FEB, 14),
851
+ 1916: (FEB, 3),
852
+ 1917: (JAN, 23),
853
+ 1918: (FEB, 11),
854
+ 1919: (FEB, 1),
855
+ 1920: (FEB, 20),
856
+ 1921: (FEB, 8),
857
+ 1922: (JAN, 28),
858
+ 1923: (FEB, 16),
859
+ 1924: (FEB, 5),
860
+ 1925: (JAN, 24),
861
+ 1926: (FEB, 13),
862
+ 1927: (FEB, 2),
863
+ 1928: (JAN, 23),
864
+ 1929: (FEB, 10),
865
+ 1930: (JAN, 30),
866
+ 1931: (FEB, 17),
867
+ 1932: (FEB, 6),
868
+ 1933: (JAN, 26),
869
+ 1934: (FEB, 14),
870
+ 1935: (FEB, 4),
871
+ 1936: (JAN, 24),
872
+ 1937: (FEB, 11),
873
+ 1938: (JAN, 31),
874
+ 1939: (FEB, 19),
875
+ 1940: (FEB, 8),
876
+ 1941: (JAN, 27),
877
+ 1942: (FEB, 15),
878
+ 1943: (FEB, 5),
879
+ 1944: (JAN, 25),
880
+ 1945: (FEB, 13),
881
+ 1946: (FEB, 2),
882
+ 1947: (JAN, 22),
883
+ 1948: (FEB, 10),
884
+ 1949: (JAN, 29),
885
+ 1950: (FEB, 17),
886
+ 1951: (FEB, 6),
887
+ 1952: (JAN, 27),
888
+ 1953: (FEB, 14),
889
+ 1954: (FEB, 3),
890
+ 1955: (JAN, 24),
891
+ 1956: (FEB, 12),
892
+ 1957: (JAN, 31),
893
+ 1958: (FEB, 18),
894
+ 1959: (FEB, 8),
895
+ 1960: (JAN, 28),
896
+ 1961: (FEB, 15),
897
+ 1962: (FEB, 5),
898
+ 1963: (JAN, 25),
899
+ 1964: (FEB, 13),
900
+ 1965: (FEB, 2),
901
+ 1966: (JAN, 21),
902
+ 1967: (FEB, 9),
903
+ 1968: (JAN, 30),
904
+ 1969: (FEB, 17),
905
+ 1970: (FEB, 6),
906
+ 1971: (JAN, 27),
907
+ 1972: (FEB, 15),
908
+ 1973: (FEB, 3),
909
+ 1974: (JAN, 23),
910
+ 1975: (FEB, 11),
911
+ 1976: (JAN, 31),
912
+ 1977: (FEB, 18),
913
+ 1978: (FEB, 7),
914
+ 1979: (JAN, 28),
915
+ 1980: (FEB, 16),
916
+ 1981: (FEB, 5),
917
+ 1982: (JAN, 25),
918
+ 1983: (FEB, 13),
919
+ 1984: (FEB, 2),
920
+ 1985: (FEB, 20),
921
+ 1986: (FEB, 9),
922
+ 1987: (JAN, 29),
923
+ 1988: (FEB, 17),
924
+ 1989: (FEB, 6),
925
+ 1990: (JAN, 27),
926
+ 1991: (FEB, 15),
927
+ 1992: (FEB, 4),
928
+ 1993: (JAN, 23),
929
+ 1994: (FEB, 10),
930
+ 1995: (JAN, 31),
931
+ 1996: (FEB, 19),
932
+ 1997: (FEB, 7),
933
+ 1998: (JAN, 28),
934
+ 1999: (FEB, 16),
935
+ 2000: (FEB, 5),
936
+ 2001: (JAN, 24),
937
+ 2002: (FEB, 12),
938
+ 2003: (FEB, 1),
939
+ 2004: (JAN, 22),
940
+ 2005: (FEB, 9),
941
+ 2006: (JAN, 29),
942
+ 2007: (FEB, 18),
943
+ 2008: (FEB, 7),
944
+ 2009: (JAN, 26),
945
+ 2010: (FEB, 14),
946
+ 2011: (FEB, 3),
947
+ 2012: (JAN, 23),
948
+ 2013: (FEB, 10),
949
+ 2014: (JAN, 31),
950
+ 2015: (FEB, 19),
951
+ 2016: (FEB, 8),
952
+ 2017: (JAN, 28),
953
+ 2018: (FEB, 16),
954
+ 2019: (FEB, 5),
955
+ 2020: (JAN, 25),
956
+ 2021: (FEB, 12),
957
+ 2022: (FEB, 1),
958
+ 2023: (JAN, 22),
959
+ 2024: (FEB, 10),
960
+ 2025: (JAN, 29),
961
+ 2026: (FEB, 17),
962
+ 2027: (FEB, 6),
963
+ 2028: (JAN, 26),
964
+ 2029: (FEB, 13),
965
+ 2030: (FEB, 3),
966
+ 2031: (JAN, 23),
967
+ 2032: (FEB, 11),
968
+ 2033: (JAN, 31),
969
+ 2034: (FEB, 19),
970
+ 2035: (FEB, 8),
971
+ 2036: (JAN, 28),
972
+ 2037: (FEB, 15),
973
+ 2038: (FEB, 4),
974
+ 2039: (JAN, 24),
975
+ 2040: (FEB, 12),
976
+ 2041: (FEB, 1),
977
+ 2042: (JAN, 22),
978
+ 2043: (FEB, 10),
979
+ 2044: (JAN, 30),
980
+ 2045: (FEB, 17),
981
+ 2046: (FEB, 6),
982
+ 2047: (JAN, 26),
983
+ 2048: (FEB, 14),
984
+ 2049: (FEB, 2),
985
+ 2050: (JAN, 23),
986
+ 2051: (FEB, 11),
987
+ 2052: (FEB, 1),
988
+ 2053: (FEB, 19),
989
+ 2054: (FEB, 8),
990
+ 2055: (JAN, 28),
991
+ 2056: (FEB, 15),
992
+ 2057: (FEB, 4),
993
+ 2058: (JAN, 24),
994
+ 2059: (FEB, 12),
995
+ 2060: (FEB, 2),
996
+ 2061: (JAN, 21),
997
+ 2062: (FEB, 9),
998
+ 2063: (JAN, 29),
999
+ 2064: (FEB, 17),
1000
+ 2065: (FEB, 5),
1001
+ 2066: (JAN, 26),
1002
+ 2067: (FEB, 14),
1003
+ 2068: (FEB, 3),
1004
+ 2069: (JAN, 23),
1005
+ 2070: (FEB, 11),
1006
+ 2071: (JAN, 31),
1007
+ 2072: (FEB, 19),
1008
+ 2073: (FEB, 7),
1009
+ 2074: (JAN, 27),
1010
+ 2075: (FEB, 15),
1011
+ 2076: (FEB, 5),
1012
+ 2077: (JAN, 24),
1013
+ 2078: (FEB, 12),
1014
+ 2079: (FEB, 2),
1015
+ 2080: (JAN, 22),
1016
+ 2081: (FEB, 9),
1017
+ 2082: (JAN, 29),
1018
+ 2083: (FEB, 17),
1019
+ 2084: (FEB, 6),
1020
+ 2085: (JAN, 26),
1021
+ 2086: (FEB, 14),
1022
+ 2087: (FEB, 3),
1023
+ 2088: (JAN, 24),
1024
+ 2089: (FEB, 10),
1025
+ 2090: (JAN, 30),
1026
+ 2091: (FEB, 18),
1027
+ 2092: (FEB, 7),
1028
+ 2093: (JAN, 27),
1029
+ 2094: (FEB, 15),
1030
+ 2095: (FEB, 5),
1031
+ 2096: (JAN, 25),
1032
+ 2097: (FEB, 12),
1033
+ 2098: (FEB, 1),
1034
+ 2099: (JAN, 21),
1035
+ }
259
1036
 
260
- :return:
261
- The number of the leap month if one exists in the year, otherwise
262
- 15.
263
- """
264
- return (
265
- self.G_LUNAR_MONTH_DAYS[lunar_year - self.START_YEAR] >> 16
266
- ) & 0x0F
1037
+ MID_AUTUMN_DATES = {
1038
+ 1901: (SEP, 27),
1039
+ 1902: (SEP, 16),
1040
+ 1903: (OCT, 5),
1041
+ 1904: (SEP, 24),
1042
+ 1905: (SEP, 13),
1043
+ 1906: (OCT, 2),
1044
+ 1907: (SEP, 22),
1045
+ 1908: (SEP, 10),
1046
+ 1909: (SEP, 28),
1047
+ 1910: (SEP, 18),
1048
+ 1911: (OCT, 6),
1049
+ 1912: (SEP, 25),
1050
+ 1913: (SEP, 15),
1051
+ 1914: (OCT, 4),
1052
+ 1915: (SEP, 23),
1053
+ 1916: (SEP, 12),
1054
+ 1917: (SEP, 30),
1055
+ 1918: (SEP, 19),
1056
+ 1919: (OCT, 8),
1057
+ 1920: (SEP, 26),
1058
+ 1921: (SEP, 16),
1059
+ 1922: (OCT, 5),
1060
+ 1923: (SEP, 25),
1061
+ 1924: (SEP, 13),
1062
+ 1925: (OCT, 2),
1063
+ 1926: (SEP, 21),
1064
+ 1927: (SEP, 10),
1065
+ 1928: (SEP, 28),
1066
+ 1929: (SEP, 17),
1067
+ 1930: (OCT, 6),
1068
+ 1931: (SEP, 26),
1069
+ 1932: (SEP, 15),
1070
+ 1933: (OCT, 4),
1071
+ 1934: (SEP, 23),
1072
+ 1935: (SEP, 12),
1073
+ 1936: (SEP, 30),
1074
+ 1937: (SEP, 19),
1075
+ 1938: (OCT, 8),
1076
+ 1939: (SEP, 27),
1077
+ 1940: (SEP, 16),
1078
+ 1941: (OCT, 5),
1079
+ 1942: (SEP, 24),
1080
+ 1943: (SEP, 14),
1081
+ 1944: (OCT, 1),
1082
+ 1945: (SEP, 20),
1083
+ 1946: (SEP, 10),
1084
+ 1947: (SEP, 29),
1085
+ 1948: (SEP, 17),
1086
+ 1949: (OCT, 6),
1087
+ 1950: (SEP, 26),
1088
+ 1951: (SEP, 15),
1089
+ 1952: (OCT, 3),
1090
+ 1953: (SEP, 22),
1091
+ 1954: (SEP, 11),
1092
+ 1955: (SEP, 30),
1093
+ 1956: (SEP, 19),
1094
+ 1957: (SEP, 8),
1095
+ 1958: (SEP, 27),
1096
+ 1959: (SEP, 17),
1097
+ 1960: (OCT, 5),
1098
+ 1961: (SEP, 24),
1099
+ 1962: (SEP, 13),
1100
+ 1963: (OCT, 2),
1101
+ 1964: (SEP, 20),
1102
+ 1965: (SEP, 10),
1103
+ 1966: (SEP, 29),
1104
+ 1967: (SEP, 18),
1105
+ 1968: (OCT, 6),
1106
+ 1969: (SEP, 26),
1107
+ 1970: (SEP, 15),
1108
+ 1971: (OCT, 3),
1109
+ 1972: (SEP, 22),
1110
+ 1973: (SEP, 11),
1111
+ 1974: (SEP, 30),
1112
+ 1975: (SEP, 20),
1113
+ 1976: (SEP, 8),
1114
+ 1977: (SEP, 27),
1115
+ 1978: (SEP, 17),
1116
+ 1979: (OCT, 5),
1117
+ 1980: (SEP, 23),
1118
+ 1981: (SEP, 12),
1119
+ 1982: (OCT, 1),
1120
+ 1983: (SEP, 21),
1121
+ 1984: (SEP, 10),
1122
+ 1985: (SEP, 29),
1123
+ 1986: (SEP, 18),
1124
+ 1987: (OCT, 7),
1125
+ 1988: (SEP, 25),
1126
+ 1989: (SEP, 14),
1127
+ 1990: (OCT, 3),
1128
+ 1991: (SEP, 22),
1129
+ 1992: (SEP, 11),
1130
+ 1993: (SEP, 30),
1131
+ 1994: (SEP, 20),
1132
+ 1995: (SEP, 9),
1133
+ 1996: (SEP, 27),
1134
+ 1997: (SEP, 16),
1135
+ 1998: (OCT, 5),
1136
+ 1999: (SEP, 24),
1137
+ 2000: (SEP, 12),
1138
+ 2001: (OCT, 1),
1139
+ 2002: (SEP, 21),
1140
+ 2003: (SEP, 11),
1141
+ 2004: (SEP, 28),
1142
+ 2005: (SEP, 18),
1143
+ 2006: (OCT, 6),
1144
+ 2007: (SEP, 25),
1145
+ 2008: (SEP, 14),
1146
+ 2009: (OCT, 3),
1147
+ 2010: (SEP, 22),
1148
+ 2011: (SEP, 12),
1149
+ 2012: (SEP, 30),
1150
+ 2013: (SEP, 19),
1151
+ 2014: (SEP, 8),
1152
+ 2015: (SEP, 27),
1153
+ 2016: (SEP, 15),
1154
+ 2017: (OCT, 4),
1155
+ 2018: (SEP, 24),
1156
+ 2019: (SEP, 13),
1157
+ 2020: (OCT, 1),
1158
+ 2021: (SEP, 21),
1159
+ 2022: (SEP, 10),
1160
+ 2023: (SEP, 29),
1161
+ 2024: (SEP, 17),
1162
+ 2025: (OCT, 6),
1163
+ 2026: (SEP, 25),
1164
+ 2027: (SEP, 15),
1165
+ 2028: (OCT, 3),
1166
+ 2029: (SEP, 22),
1167
+ 2030: (SEP, 12),
1168
+ 2031: (OCT, 1),
1169
+ 2032: (SEP, 19),
1170
+ 2033: (SEP, 8),
1171
+ 2034: (SEP, 27),
1172
+ 2035: (SEP, 16),
1173
+ 2036: (OCT, 4),
1174
+ 2037: (SEP, 24),
1175
+ 2038: (SEP, 13),
1176
+ 2039: (OCT, 2),
1177
+ 2040: (SEP, 20),
1178
+ 2041: (SEP, 10),
1179
+ 2042: (SEP, 28),
1180
+ 2043: (SEP, 17),
1181
+ 2044: (OCT, 5),
1182
+ 2045: (SEP, 25),
1183
+ 2046: (SEP, 15),
1184
+ 2047: (OCT, 4),
1185
+ 2048: (SEP, 22),
1186
+ 2049: (SEP, 11),
1187
+ 2050: (SEP, 30),
1188
+ 2051: (SEP, 19),
1189
+ 2052: (SEP, 7),
1190
+ 2053: (SEP, 26),
1191
+ 2054: (SEP, 16),
1192
+ 2055: (OCT, 5),
1193
+ 2056: (SEP, 24),
1194
+ 2057: (SEP, 13),
1195
+ 2058: (OCT, 2),
1196
+ 2059: (SEP, 21),
1197
+ 2060: (SEP, 9),
1198
+ 2061: (SEP, 28),
1199
+ 2062: (SEP, 17),
1200
+ 2063: (OCT, 6),
1201
+ 2064: (SEP, 25),
1202
+ 2065: (SEP, 15),
1203
+ 2066: (OCT, 3),
1204
+ 2067: (SEP, 23),
1205
+ 2068: (SEP, 11),
1206
+ 2069: (SEP, 29),
1207
+ 2070: (SEP, 19),
1208
+ 2071: (SEP, 8),
1209
+ 2072: (SEP, 26),
1210
+ 2073: (SEP, 16),
1211
+ 2074: (OCT, 5),
1212
+ 2075: (SEP, 24),
1213
+ 2076: (SEP, 12),
1214
+ 2077: (OCT, 1),
1215
+ 2078: (SEP, 20),
1216
+ 2079: (SEP, 10),
1217
+ 2080: (SEP, 28),
1218
+ 2081: (SEP, 17),
1219
+ 2082: (OCT, 6),
1220
+ 2083: (SEP, 26),
1221
+ 2084: (SEP, 14),
1222
+ 2085: (OCT, 3),
1223
+ 2086: (SEP, 22),
1224
+ 2087: (SEP, 11),
1225
+ 2088: (SEP, 29),
1226
+ 2089: (SEP, 19),
1227
+ 2090: (SEP, 8),
1228
+ 2091: (SEP, 27),
1229
+ 2092: (SEP, 16),
1230
+ 2093: (OCT, 5),
1231
+ 2094: (SEP, 24),
1232
+ 2095: (SEP, 13),
1233
+ 2096: (SEP, 30),
1234
+ 2097: (SEP, 20),
1235
+ 2098: (SEP, 9),
1236
+ 2099: (SEP, 29),
1237
+ }
267
1238
 
268
- def _lunar_month_days(self, lunar_year: int, lunar_month: int) -> int:
269
- """
270
- Calculate the number of days in a lunar month.
271
-
272
- :param lunar_year:
273
- The lunar year.
274
-
275
- :param lunar_month:
276
- The lunar month of the lunar year.
277
-
278
- :return:
279
- The number of days in the lunar month.
280
- """
281
- return 29 + (
282
- (
283
- self.G_LUNAR_MONTH_DAYS[lunar_year - self.START_YEAR]
284
- >> lunar_month
285
- )
286
- & 0x01
1239
+ def _get_holiday(self, holiday: str, year: int) -> Tuple[Optional[date], bool]:
1240
+ estimated_dates = getattr(self, f"{holiday}_DATES", {})
1241
+ exact_dates = getattr(
1242
+ self,
1243
+ f"{holiday}_DATES_{_CustomCalendar.CUSTOM_ATTR_POSTFIX}",
1244
+ {},
287
1245
  )
1246
+ dt = exact_dates.get(year, estimated_dates.get(year, ()))
1247
+ return date(year, *dt) if dt else None, year not in exact_dates
288
1248
 
289
- def _lunar_year_days(self, year: int) -> int:
290
- """
291
- Calculate the number of days in a lunar year.
292
-
293
- :param year:
294
- The lunar year.
295
-
296
- :return:
297
- The number of days in the lunar year.
298
- """
299
- days = 0
300
- months_day = self.G_LUNAR_MONTH_DAYS[year - self.START_YEAR]
301
- for i in range(1, 13 if self._get_leap_month(year) == 0x0F else 14):
302
- day = 29 + ((months_day >> i) & 0x01)
303
- days += day
304
- return days
305
-
306
- @lru_cache()
307
- def _span_days(self, year: int) -> int:
308
- """
309
- Calculate the number of days elapsed since self.SOLAR_START_DATE to the
310
- beginning of the year.
311
-
312
- :param year:
313
- The year.
314
-
315
- :return:
316
- The number of days since self.SOLAR_START_DATE.
317
- """
318
- span_days = 0
319
- for y in range(self.START_YEAR, year):
320
- span_days += self._lunar_year_days(y)
321
- return span_days
322
-
323
- def lunar_n_y_date(self, year: int) -> date:
324
- """
325
- Calculate the Gregorian date of Chinese Lunar New Year.
326
-
327
- This is a faster implementation than calling
328
- ``lunar_to_gre(year, 1, 1)``.
329
-
330
- :param year:
331
- The Gregorian year.
332
-
333
- :return:
334
- The Gregorian date of Chinese Lunar New Year.
335
- """
336
- # The Chinese calendar defines the lunar month containing the winter
337
- # solstice as the eleventh month, which means that Chinese New Year
338
- # usually falls on the second new moon after the winter solstice
339
- # (rarely the third if an intercalary month intervenes). In more
340
- # than 96 percent of the years, Chinese New Year's Day is the closest
341
- # date to a new moon to lichun (Chinese: 立春; "start of spring") on 4
342
- # or 5 February, and the first new moon after dahan (Chinese: 大寒;
343
- # "major cold"). In the Gregorian calendar, the Chinese New Year begins
344
- # at the new moon that falls between 21 January and 20 February.
345
-
346
- span_days = self._span_days(year)
347
- # Always in first month (by definition)
348
- # leap_month = self._get_leap_month(year)
349
- # for m in range(1, 1 + (1 > leap_month)):
350
- # span_days += self._lunar_month_days(year, m)
351
- return self.SOLAR_START_DATE + td(days=span_days)
352
-
353
- def lunar_to_gre(
354
- self, year: int, month: int, day: int, leap: bool = True
355
- ) -> date:
356
- """
357
- Calculate the Gregorian date of a Chinese lunar day and month in a
358
- given Gregorian year.
359
-
360
- :param year:
361
- The Gregorian year.
362
-
363
- :param year:
364
- The Chinese lunar month.
365
-
366
- :param year:
367
- The Chinese lunar day.
368
-
369
- :return:
370
- The Gregorian date.
371
- """
372
- span_days = self._span_days(year)
373
- leap_month = self._get_leap_month(year) if leap else 15
374
- for m in range(1, month + (month > leap_month)):
375
- span_days += self._lunar_month_days(year, m)
376
- span_days += day - 1
377
- return self.SOLAR_START_DATE + td(days=span_days)
378
-
379
- def vesak_date(self, year: int) -> date:
380
- """
381
- Calculate the estimated Gregorian date of Vesak for Thailand, Laos,
382
- Singapore and Indonesia, corresponding to the fourteenth day of the
383
- fourth month in the Chinese lunar calendar. See `Wikipedia
384
- <https://en.wikipedia.org/wiki/Vesak#Dates_of_observance>`__.
385
-
386
- :param year:
387
- The Gregorian year.
388
-
389
- :return:
390
- Estimated Gregorian date of Vesak (14th day of 4th month of the
391
- lunar calendar).
392
- """
393
- span_days = self._span_days(year)
394
- leap_month = self._get_leap_month(year)
395
- for m in range(1, 4 + (4 > leap_month)):
396
- span_days += self._lunar_month_days(year, m)
397
- span_days += 14
398
- return self.SOLAR_START_DATE + td(days=span_days)
399
-
400
- def vesak_may_date(self, year: int) -> date:
401
- """
402
- Calculate the estimated Gregorian date of Vesak for Sri Lanka, Nepal,
403
- India, Bangladesh and Malaysia, corresponding to the day of the
404
- first full moon in May in the Gregorian calendar. See `Wikipedia
405
- <https://en.wikipedia.org/wiki/Vesak#Dates_of_observance>`__.
406
-
407
- :param year:
408
- The Gregorian year.
409
-
410
- :return:
411
- Estimated Gregorian date of Vesak (first full moon in May).
412
- """
413
- span_days = self._span_days(year)
414
- vesak_may_date = self.SOLAR_START_DATE + td(days=span_days + 14)
415
- m = 1
416
- while vesak_may_date.month < 5:
417
- vesak_may_date += td(days=self._lunar_month_days(year, m))
418
- m += 1
419
- return vesak_may_date
420
-
421
- def s_diwali_date(self, year: int) -> date:
422
- """
423
- Calculate the estimated Gregorian date of Southern India (Tamil)
424
- Diwali.
1249
+ def buddha_birthday_date(self, year: int) -> Tuple[Optional[date], bool]:
1250
+ return self._get_holiday(BUDDHA_BIRTHDAY, year)
425
1251
 
426
- Defined as the date of Amāvásyā (new moon) of Kārttikai, which
427
- corresponds with the months of November or December in the Gregorian
428
- calendar. See `Wikipedia <https://en.wikipedia.org/wiki/Diwali>`__.
1252
+ def double_ninth_date(self, year: int) -> Tuple[Optional[date], bool]:
1253
+ return self._get_holiday(DOUBLE_NINTH, year)
429
1254
 
430
- :param year:
431
- The Gregorian year.
1255
+ def dragon_boat_date(self, year: int) -> Tuple[Optional[date], bool]:
1256
+ return self._get_holiday(DRAGON_BOAT, year)
432
1257
 
433
- :return:
434
- Estimated Gregorian date of Southern India (Tamil) Diwali.
435
- """
436
- span_days = self._span_days(year)
437
- leap_month = self._get_leap_month(year)
438
- for m in range(1, 10 + (10 > leap_month)):
439
- span_days += self._lunar_month_days(year, m)
440
- span_days -= 2
441
- return self.SOLAR_START_DATE + td(days=span_days)
1258
+ def hung_kings_date(self, year: int) -> Tuple[Optional[date], bool]:
1259
+ return self._get_holiday(HUNG_KINGS, year)
442
1260
 
443
- def thaipusam_date(self, year: int) -> date:
444
- """
445
- Calculate the estimated Gregorian date of Thaipusam (Tamil).
1261
+ def lunar_new_year_date(self, year: int) -> Tuple[Optional[date], bool]:
1262
+ return self._get_holiday(LUNAR_NEW_YEAR, year)
446
1263
 
447
- Defined as the date of the full moon in the Tamil month of Thai, which
448
- corresponds with the months of January or February in the Gregorian
449
- calendar. See `Wikipedia <https://en.wikipedia.org/wiki/Thaipusam>`__.
1264
+ def mid_autumn_date(self, year: int) -> Tuple[Optional[date], bool]:
1265
+ return self._get_holiday(MID_AUTUMN, year)
450
1266
 
451
- :param year:
452
- The Gregorian year.
453
1267
 
454
- :return:
455
- Estimated Gregorian date of Thaipusam (Tamil).
456
- """
457
- span_days = self._span_days(year)
458
- leap_month = self._get_leap_month(year)
459
- for m in range(1, 1 + (leap_month <= 6)):
460
- span_days += self._lunar_month_days(year, m)
461
- span_days -= 15
462
- return self.SOLAR_START_DATE + td(days=span_days)
1268
+ class _CustomChineseCalendar(_CustomCalendar, _ChineseLunisolar):
1269
+ pass