hdays.py 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207
  1. # Copyright (c) 2017-present, Facebook, Inc.
  2. # All rights reserved.
  3. #
  4. # This source code is licensed under the BSD-style license found in the
  5. # LICENSE file in the root directory of this source tree. An additional grant
  6. # of patent rights can be found in the PATENTS file in the same directory.
  7. from __future__ import absolute_import
  8. from __future__ import division
  9. from __future__ import print_function
  10. from __future__ import unicode_literals
  11. from holidays import HolidayBase, MONDAY, WEEKEND, rd, easter
  12. from lunardate import LunarDate
  13. from calendar import Calendar
  14. from datetime import date, timedelta
  15. from convertdate.islamic import to_gregorian, from_gregorian
  16. import warnings
  17. # Official public holidays at a country level
  18. # ------------ Holidays in Brazil---------------------
  19. class Brazil(HolidayBase):
  20. """
  21. Implement public holidays in Brazil
  22. Reference:
  23. https://en.wikipedia.org/wiki/Public_holidays_in_Brazil
  24. """
  25. def __init__(self, **kwargs):
  26. self.country = "BR"
  27. HolidayBase.__init__(self, **kwargs)
  28. def _populate(self, year):
  29. # New Year's Day
  30. if not self.observed and date(year, 1, 1).weekday() in WEEKEND:
  31. pass
  32. else:
  33. self[date(year, 1, 1)] = "New Year's Day"
  34. # Tiradentes
  35. self[date(year, 4, 21)] = "Tiradentes"
  36. # Worker's Day
  37. self[date(year, 5, 1)] = "Worker's Day"
  38. # Independence Day
  39. self[date(year, 9, 7)] = "Independence Day"
  40. # Our Lady of the Apparition
  41. self[date(year, 10, 12)] = "Our Lady of the Apparition"
  42. # All Souls' Day
  43. self[date(year, 11, 2)] = "All Souls' Day"
  44. # Republic Proclamation Day
  45. self[date(year, 11, 5)] = "Republic Proclamation Day"
  46. # Christmas
  47. self[date(year, 12, 25)] = "Christmas"
  48. class BR(Brazil):
  49. pass
  50. # ------------ Holidays in Indonesia---------------------
  51. class Indonesia(HolidayBase):
  52. """
  53. Implement public holidays in Indonesia
  54. Reference:
  55. https://en.wikipedia.org/wiki/Public_holidays_in_Indonesia
  56. Please note: Indonesia is a multi-cultural community and we only implement
  57. the national wide public holidays.
  58. """
  59. def __init__(self, **kwargs):
  60. self.country = "ID"
  61. HolidayBase.__init__(self, **kwargs)
  62. def _populate(self, year):
  63. # New Year's Day
  64. if not self.observed and date(year, 1, 1).weekday() in WEEKEND:
  65. pass
  66. else:
  67. self[date(year, 1, 1)] = "New Year's Day"
  68. # Chinese New Year/ Spring Festival
  69. name = "Chinese New Year"
  70. self[LunarDate(year, 1, 1).toSolarDate()] = name
  71. # Day of Silence / Nyepi
  72. # Note:
  73. # This holiday is determined by Balinese calendar, which is not currently
  74. # available. Only hard coded version of this holiday from 2009 to 2019
  75. # is available.
  76. warning_msg = "We only support Nyepi holiday from 2009 to 2019"
  77. warnings.warn(warning_msg, Warning)
  78. name = "Day of Silence/ Nyepi"
  79. if year == 2009:
  80. self[date(year, 3, 26)] = name
  81. elif year == 2010:
  82. self[date(year, 3, 16)] = name
  83. elif year == 2011:
  84. self[date(year, 3, 5)] = name
  85. elif year == 2012:
  86. self[date(year, 3, 23)] = name
  87. elif year == 2013:
  88. self[date(year, 3, 12)] = name
  89. elif year == 2014:
  90. self[date(year, 3, 31)] = name
  91. elif year == 2015:
  92. self[date(year, 3, 21)] = name
  93. elif year == 2016:
  94. self[date(year, 3, 9)] = name
  95. elif year == 2017:
  96. self[date(year, 3, 28)] = name
  97. elif year == 2018:
  98. self[date(year, 3, 17)] = name
  99. elif year == 2019:
  100. self[date(year, 3, 7)] = name
  101. else:
  102. pass
  103. # Ascension of the Prophet
  104. islam_year = from_gregorian(year, 3, 17)[0]
  105. y, m, d = to_gregorian(islam_year, 7, 27)
  106. name = "Ascension of the Prophet"
  107. self[date(year, m, d)] = name
  108. # Labor Day
  109. name = "Labor Day"
  110. self[date(year, 5, 1)] = name
  111. # Ascension of Jesus Christ
  112. name = "Ascension of Jesus"
  113. hdate = easter(year) + rd(days=+39)
  114. self[hdate] = name
  115. # Buddha's Birthday
  116. name = "Buddha's Birthday"
  117. self[LunarDate(year, 4, 15).toSolarDate()] = name
  118. # Pancasila Day, since 2017
  119. if year >= 2017:
  120. name = "Pancasila Day"
  121. self[date(year, 6, 1)] = name
  122. # Eid al-Fitr
  123. islam_year = from_gregorian(year, 6, 15)[0]
  124. y1, m1, d1 = to_gregorian(islam_year, 10, 1)
  125. y2, m2, d2 = to_gregorian(islam_year, 10, 2)
  126. name = "Eid al-Fitr"
  127. self[date(year, m1, d1)] = name
  128. self[date(year, m2, d2)] = name
  129. # Independence Day
  130. name = "Independence Day"
  131. self[date(year, 8, 17)] = name
  132. # Feast of the Sacrifice
  133. islam_year = from_gregorian(year, 8, 22)[0]
  134. y, m, d = to_gregorian(islam_year, 12, 10)
  135. name = "Feast of the Sacrifice"
  136. self[date(year, m, d)] = name
  137. # Islamic New Year
  138. islam_year = from_gregorian(year, 9, 11)[0]
  139. y, m, d = to_gregorian(islam_year + 1, 1, 1)
  140. name = "Islamic New Year"
  141. self[date(year, m, d)] = name
  142. # Birth of the Prophet
  143. islam_year = from_gregorian(year, 11, 20)[0]
  144. y, m, d = to_gregorian(islam_year + 1, 3, 12)
  145. name = "Birth of the Prophet"
  146. self[date(year, m, d)] = name
  147. # Christmas
  148. self[date(year, 12, 25)] = "Christmas"
  149. class ID(Indonesia):
  150. pass
  151. # ------------ Holidays in India---------------------
  152. class India(HolidayBase):
  153. """
  154. Implement public holidays in India
  155. Reference:
  156. https://en.wikipedia.org/wiki/Public_holidays_in_India
  157. Please note:
  158. India is a culturally diverse and fervent society, celebrate various
  159. holidays and festivals. We only implement the holidays that **all states
  160. and territories** celebrate.
  161. """
  162. def __init__(self, **kwargs):
  163. self.country = "IN"
  164. HolidayBase.__init__(self, **kwargs)
  165. def _populate(self, year):
  166. # --------------------------------
  167. # Three national days
  168. # Republic Day
  169. # Independence Day
  170. # Gandhi Jayanti
  171. # --------------------------------
  172. # Republic Day
  173. name = "Republic Day"
  174. self[date(year, 1, 26)] = name
  175. # Independence Day
  176. name = "Independence Day"
  177. self[date(year, 8, 15)] = name
  178. # Gandhi Jayanti
  179. name = "Gandhi Jayanti"
  180. self[date(year, 10, 2)] = name
  181. # --------------------------------
  182. # Hindo holidays
  183. # Diwali
  184. # Holi
  185. # --------------------------------
  186. # Diwali, Holi
  187. # http://www.theholidayspot.com/diwali/calendar.htm
  188. # https://www.timeanddate.com/holidays/india/diwali?starty=
  189. # https://www.infoplease.com/calendar-holidays/major-holidays/
  190. warning_msg = "We only support Diwali and Holi holidays from 2010 to 2025"
  191. warnings.warn(warning_msg, Warning)
  192. name1 = "Diwali"
  193. name2 = "Holi"
  194. if year == 2010:
  195. self[date(year, 12, 5)] = name1
  196. self[date(year, 2, 28)] = name2
  197. elif year == 2011:
  198. self[date(year, 10, 26)] = name1
  199. self[date(year, 3, 19)] = name2
  200. elif year == 2012:
  201. self[date(year, 11, 13)] = name1
  202. self[date(year, 3, 8)] = name2
  203. elif year == 2013:
  204. self[date(year, 11, 3)] = name1
  205. self[date(year, 3, 26)] = name2
  206. elif year == 2014:
  207. self[date(year, 10, 23)] = name1
  208. self[date(year, 3, 17)] = name2
  209. elif year == 2015:
  210. self[date(year, 11, 11)] = name1
  211. self[date(year, 3, 6)] = name2
  212. elif year == 2016:
  213. self[date(year, 10, 30)] = name1
  214. self[date(year, 3, 24)] = name2
  215. elif year == 2017:
  216. self[date(year, 10, 19)] = name1
  217. self[date(year, 3, 13)] = name2
  218. elif year == 2018:
  219. self[date(year, 11, 7)] = name1
  220. self[date(year, 3, 2)] = name2
  221. elif year == 2019:
  222. self[date(year, 10, 27)] = name1
  223. self[date(year, 3, 21)] = name2
  224. elif year == 2020:
  225. self[date(year, 11, 14)] = name1
  226. self[date(year, 3, 9)] = name2
  227. elif year == 2021:
  228. self[date(year, 11, 4)] = name1
  229. self[date(year, 3, 28)] = name2
  230. elif year == 2022:
  231. self[date(year, 10, 24)] = name1
  232. self[date(year, 3, 18)] = name2
  233. elif year == 2023:
  234. self[date(year, 10, 12)] = name1
  235. self[date(year, 3, 7)] = name2
  236. elif year == 2024:
  237. self[date(year, 11, 1)] = name1
  238. self[date(year, 3, 25)] = name2
  239. elif year == 2025:
  240. self[date(year, 10, 21)] = name1
  241. self[date(year, 3, 14)] = name2
  242. else:
  243. pass
  244. # --------------------------------
  245. # Islamic holidays
  246. # Day of Ashura
  247. # Mawlid
  248. # Eid ul-Fitr
  249. # Eid al-Adha
  250. # --------------------------------
  251. # Day of Ashura
  252. # 10th day of 1st Islamic month
  253. islam_year = from_gregorian(year, 10, 1)[0]
  254. y, m, d = to_gregorian(islam_year, 1, 10)
  255. name = "Day of Ashura"
  256. self[date(year, m, d)] = name
  257. # Mawlid, Birth of the Prophet
  258. # 12th day of 3rd Islamic month
  259. islam_year = from_gregorian(year, 11, 20)[0]
  260. y, m, d = to_gregorian(islam_year, 3, 12)
  261. name = "Mawlid"
  262. self[date(y, m, d)] = name
  263. # Eid ul-Fitr
  264. # 1st and 2nd day of 10th Islamic month
  265. islam_year = from_gregorian(year, 6, 15)[0]
  266. y1, m1, d1 = to_gregorian(islam_year, 10, 1)
  267. y2, m2, d2 = to_gregorian(islam_year, 10, 2)
  268. name = "Eid al-Fitr"
  269. self[date(year, m1, d1)] = name
  270. self[date(year, m2, d2)] = name
  271. # Eid al-Adha, i.e., Feast of the Sacrifice
  272. islam_year = from_gregorian(year, 8, 22)[0]
  273. y, m, d = to_gregorian(islam_year, 12, 10)
  274. name = "Feast of the Sacrifice"
  275. self[date(year, m, d)] = name
  276. # --------------------------------
  277. # Christian holidays
  278. # New Year, Palm Sunday,
  279. # Maundy Thursday
  280. # Good Friday
  281. # Easter Sunday
  282. # Feast of Pentecost
  283. # Fest of St. Theresa of Calcutta
  284. # Feast of the Blessed Virgin
  285. # All Saints Day
  286. # All Souls Day
  287. # Christmas Day
  288. # Boxing Day
  289. # Feast of Holy Family
  290. # --------------------------------
  291. # New Year's Day
  292. self[date(year, 1, 1)] = "New Year's Day"
  293. # Palm Sunday
  294. name = "Palm Sunday"
  295. self[easter(year) - rd(days=7)] = name
  296. # Maundy Thursday
  297. name = "Maundy Thursday"
  298. self[easter(year) - rd(days=3)] = name
  299. # Good Friday
  300. name = "Good Friday"
  301. self[easter(year) - rd(days=2)] = name
  302. # Easter Sunday
  303. name = "Easter Sunday"
  304. self[easter(year)] = name
  305. # Feast of Pentecost
  306. name = "Feast of Pentecost"
  307. self[easter(year) + rd(days=49)] = name
  308. # Fest of St. Theresa of Calcutta
  309. name = "Fest of St. Theresa of Calcutta"
  310. self[date(year, 9, 5)] = name
  311. # Feast of the Blessed Virgin
  312. name = "Feast of the Blessed Virgin"
  313. self[date(year, 9, 8)] = name
  314. # All Saints Day
  315. name = "All Saints Day"
  316. self[date(year, 11, 1)] = name
  317. # All Souls Day
  318. name = "All Souls Day"
  319. self[date(year, 11, 2)] = name
  320. # Christmas
  321. name = "Christmas Day"
  322. self[date(year, 12, 25)] = name
  323. # Boxing Day
  324. name = "Boxing Day"
  325. self[date(year, 12, 26)] = name
  326. # Feast of Holy Family
  327. name = "Feast of Holy Family"
  328. self[date(year, 12, 30)] = name
  329. class IN(India):
  330. pass
  331. # ------------ Holidays in Malaysia---------------------
  332. class Malaysia(HolidayBase):
  333. """
  334. Implement public holidays in Malaysia
  335. Reference:
  336. https://en.wikipedia.org/wiki/Public_holidays_in_Malaysia
  337. """
  338. def __init__(self, **kwargs):
  339. self.country = "MY"
  340. HolidayBase.__init__(self, **kwargs)
  341. def _populate(self, year):
  342. # New Year's Day
  343. name = "New Year's Day"
  344. self[date(year, 1, 1)] = name
  345. # Birthday of Prophet, Mawlid in India
  346. # 12th day of 3rd Islamic month
  347. islam_year = from_gregorian(year, 11, 20)[0]
  348. y, m, d = to_gregorian(islam_year, 3, 12)
  349. name = "Birth of Prophet"
  350. self[date(y, m, d)] = name
  351. # Chinese New Year
  352. name = "Chinese New Year"
  353. self[LunarDate(year, 1, 1).toSolarDate()] = name
  354. # Tamil New Year
  355. # Note: it's not necessarily 04/14
  356. # due to the local calendar
  357. # other possible dates are 04/13 and 04/15
  358. name = "Tamil New Year"
  359. self[date(year, 4, 14)] = name
  360. # Good Friday
  361. name = "Good Friday"
  362. self[easter(year) - rd(days=2)] = name
  363. # Labor Day
  364. name = "Labor Day"
  365. self[date(year, 5, 1)] = name
  366. # Buddha's Birthday
  367. name = "Wesak Day"
  368. self[LunarDate(year, 4, 15).toSolarDate()] = name
  369. # King's birthday
  370. # https://www.thestar.com.my/news/nation/2017/04/26/
  371. # Before 2017: first Saturday of June
  372. # 2017-2021: last Saturday of July
  373. name = "King's birthday"
  374. if year < 2017:
  375. c = Calendar(firstweekday=MONDAY)
  376. monthcal = c.monthdatescalendar(year, 6)
  377. l1 = len(monthcal)
  378. saturdays = []
  379. for i in range(l1):
  380. if monthcal[i][5].month == 6:
  381. saturdays.append(monthcal[i][5])
  382. self[saturdays[0]] = name
  383. elif (year >= 2017) and (year <= 2021):
  384. c = Calendar(firstweekday=MONDAY)
  385. monthcal = c.monthdatescalendar(year, 7)
  386. l1 = len(monthcal)
  387. saturdays = []
  388. for i in range(l1):
  389. if monthcal[i][5].month == 7:
  390. saturdays.append(monthcal[i][5])
  391. self[saturdays[-1]] = name
  392. # Eid al-Fitr
  393. islam_year = from_gregorian(year, 6, 15)[0]
  394. y1, m1, d1 = to_gregorian(islam_year, 10, 1)
  395. y2, m2, d2 = to_gregorian(islam_year, 10, 2)
  396. name = "Eid al-Fitr"
  397. self[date(year, m1, d1)] = name
  398. self[date(year, m2, d2)] = name
  399. # Malaysia Day
  400. name = "Malaysia Day"
  401. self[date(year, 9, 16)] = name
  402. # Feast of the Sacrifice
  403. islam_year = from_gregorian(year, 8, 22)[0]
  404. y, m, d = to_gregorian(islam_year, 12, 10)
  405. name = "Feast of the Sacrifice"
  406. self[date(year, m, d)] = name
  407. # First Day of Muharram
  408. islam_year = from_gregorian(year, 9, 11)[0]
  409. y, m, d = to_gregorian(islam_year + 1, 1, 1)
  410. name = "First Day of Muharram"
  411. self[date(y, m, d)] = name
  412. # Christmas
  413. name = "Christmas Day"
  414. self[date(year, 12, 25)] = name
  415. class MY(Malaysia):
  416. pass
  417. # ------------ Holidays in Vietnam---------------------
  418. class Vietnam(HolidayBase):
  419. """
  420. Implement public holidays in Vietnam
  421. Reference:
  422. https://en.wikipedia.org/wiki/Public_holidays_in_Vietnam
  423. """
  424. def __init__(self, **kwargs):
  425. self.country = "VN"
  426. HolidayBase.__init__(self, **kwargs)
  427. def _populate(self, year):
  428. # New Year's Day
  429. name = "New Year's Day"
  430. self[date(year, 1, 1)] = name
  431. # Vietnamese New Year
  432. name = "Vietnamese New Year"
  433. self[LunarDate(year - 1, 12, 30).toSolarDate()] = name
  434. self[LunarDate(year, 1, 1).toSolarDate()] = name
  435. self[LunarDate(year, 1, 2).toSolarDate()] = name
  436. self[LunarDate(year, 1, 3).toSolarDate()] = name
  437. self[LunarDate(year, 1, 4).toSolarDate()] = name
  438. self[LunarDate(year, 1, 5).toSolarDate()] = name
  439. # Hung Kings Commemorations
  440. name = "Hung Kings Commemorations"
  441. self[LunarDate(year, 3, 10).toSolarDate()] = name
  442. # Reunification Day
  443. name = "Reunification Day"
  444. self[date(year, 4, 30)] = name
  445. # Labor Day/International Workers' Day
  446. name = "Labor Day/International Workers' Day"
  447. self[date(year, 5, 1)] = name
  448. # National Day
  449. name = "National Day"
  450. self[date(year, 9, 2)] = name
  451. class VN(Vietnam):
  452. pass
  453. # ------------ Holidays in Thailand---------------------
  454. class Thailand(HolidayBase):
  455. """
  456. Implement public holidays in Thailand
  457. Reference:
  458. https://en.wikipedia.org/wiki/Public_holidays_in_Thailand
  459. """
  460. def __init__(self, **kwargs):
  461. self.country = "TH"
  462. HolidayBase.__init__(self, **kwargs)
  463. def _populate(self, year):
  464. # New Year's Day
  465. name = "New Year's Day"
  466. self[date(year, 1, 1)] = name
  467. # Magha Pujab
  468. # Note:
  469. # This holiday is determined by Buddhist calendar, which is not currently
  470. # available. Only hard coded version of this holiday from 2016 to 2019
  471. # is available.
  472. name = "Magha Pujab/Makha Bucha"
  473. if year == 2016:
  474. self[date(year, 2, 22)] = name
  475. elif year == 2017:
  476. self[date(year, 2, 11)] = name
  477. elif year == 2018:
  478. self[date(year, 3, 1)] = name
  479. elif year == 2019:
  480. self[date(year, 2, 19)] = name
  481. else:
  482. pass
  483. # Chakri Memorial Day
  484. name = "Chakri Memorial Day"
  485. april_6 = date(year, 4, 6).weekday()
  486. if april_6 == 5:
  487. self[date(year, 4, 6 + 2)] = name
  488. elif april_6 == 6:
  489. self[date(year, 4, 6 + 1)] = name
  490. else:
  491. self[date(year, 4, 6)] = name
  492. # Songkran Festival
  493. name = "Songkran Festival"
  494. self[date(year, 4, 14)] = name
  495. # Royal Ploughing Ceremony
  496. # arbitrary day in May
  497. # Buddha's Birthday
  498. name = "Buddha's Birthday"
  499. self[LunarDate(year, 4, 15).toSolarDate()] = name
  500. # Coronation Day, removed in 2017
  501. name = "Coronation Day"
  502. if year < 2017:
  503. self[date(year, 5, 5)] = name
  504. # King Maha Vajiralongkorn's Birthday
  505. name = "King Maha Vajiralongkorn's Birthday"
  506. self[date(year, 7, 28)] = name
  507. # Asalha Puja
  508. # This is also a Buddha holiday, and we only implement
  509. # the hard coded version from 2006 to 2025
  510. # reference:
  511. # http://www.when-is.com/asalha_puja.asp
  512. warning_msg = "We only support Asalha Puja holiday from 2006 to 2025"
  513. warnings.warn(warning_msg, Warning)
  514. name = "Asalha Puja"
  515. if year == 2006:
  516. self[date(year, 7, 11)] = name
  517. elif year == 2007:
  518. self[date(year, 6, 30)] = name
  519. elif year == 2008:
  520. self[date(year, 7, 18)] = name
  521. elif year == 2009:
  522. self[date(year, 7, 7)] = name
  523. elif year == 2010:
  524. self[date(year, 7, 25)] = name
  525. elif year == 2011:
  526. self[date(year, 7, 15)] = name
  527. elif year == 2012:
  528. self[date(year, 8, 2)] = name
  529. elif year == 2013:
  530. self[date(year, 7, 30)] = name
  531. elif year == 2014:
  532. self[date(year, 7, 13)] = name
  533. elif year == 2015:
  534. self[date(year, 7, 30)] = name
  535. elif year == 2016:
  536. self[date(year, 7, 15)] = name
  537. elif year == 2017:
  538. self[date(year, 7, 9)] = name
  539. elif year == 2018:
  540. self[date(year, 7, 29)] = name
  541. elif year == 2019:
  542. self[date(year, 7, 16)] = name
  543. elif year == 2020:
  544. self[date(year, 7, 5)] = name
  545. elif year == 2021:
  546. self[date(year, 7, 24)] = name
  547. elif year == 2022:
  548. self[date(year, 7, 13)] = name
  549. elif year == 2023:
  550. self[date(year, 7, 3)] = name
  551. elif year == 2024:
  552. self[date(year, 7, 21)] = name
  553. elif year == 2025:
  554. self[date(year, 7, 10)] = name
  555. else:
  556. pass
  557. # Beginning of Vassa
  558. warning_msg = "We only support Vassa holiday from 2006 to 2020"
  559. warnings.warn(warning_msg, Warning)
  560. name = "Beginning of Vassa"
  561. if year == 2006:
  562. self[date(year, 7, 12)] = name
  563. elif year == 2007:
  564. self[date(year, 7, 31)] = name
  565. elif year == 2008:
  566. self[date(year, 7, 19)] = name
  567. elif year == 2009:
  568. self[date(year, 7, 8)] = name
  569. elif year == 2010:
  570. self[date(year, 7, 27)] = name
  571. elif year == 2011:
  572. self[date(year, 7, 16)] = name
  573. elif year == 2012:
  574. self[date(year, 8, 3)] = name
  575. elif year == 2013:
  576. self[date(year, 7, 23)] = name
  577. elif year == 2014:
  578. self[date(year, 7, 13)] = name
  579. elif year == 2015:
  580. self[date(year, 8, 1)] = name
  581. elif year == 2016:
  582. self[date(year, 7, 20)] = name
  583. elif year == 2017:
  584. self[date(year, 7, 9)] = name
  585. elif year == 2018:
  586. self[date(year, 7, 28)] = name
  587. elif year == 2019:
  588. self[date(year, 7, 17)] = name
  589. elif year == 2020:
  590. self[date(year, 7, 6)] = name
  591. else:
  592. pass
  593. # The Queen Sirikit's Birthday
  594. name = "The Queen Sirikit's Birthday"
  595. self[date(year, 8, 12)] = name
  596. # Anniversary for the Death of King Bhumibol Adulyadej
  597. name = "Anniversary for the Death of King Bhumibol Adulyadej"
  598. self[date(year, 10, 13)] = name
  599. # King Chulalongkorn Day
  600. name = "King Chulalongkorn Day"
  601. self[date(year, 10, 23)] = name
  602. # King Bhumibol Adulyadej's Birthday Anniversary
  603. name = "King Bhumibol Adulyadej's Birthday Anniversary"
  604. self[date(year, 12, 5)] = name
  605. # Constitution Day
  606. name = "Constitution Day"
  607. self[date(year, 12, 10)] = name
  608. # New Year's Eve
  609. name = "New Year's Eve"
  610. self[date(year, 12, 31)] = name
  611. class TH(Thailand):
  612. pass
  613. # ------------ Holidays in Philippines---------------------
  614. class Philippines(HolidayBase):
  615. """
  616. Implement public holidays in Philippines
  617. Reference:
  618. https://en.wikipedia.org/wiki/Public_holidays_in_Thailand
  619. """
  620. def __init__(self, **kwargs):
  621. self.country = "PH"
  622. HolidayBase.__init__(self, **kwargs)
  623. def _populate(self, year):
  624. # New Year's Day
  625. name = "New Year's Day"
  626. self[date(year, 1, 1)] = name
  627. # Maundy Thursday
  628. name = "Maundy Thursday"
  629. self[easter(year) - rd(days=3)] = name
  630. # Good Friday
  631. name = "Good Friday"
  632. self[easter(year) - rd(days=2)] = name
  633. # Day of Valor
  634. name = "Day of Valor"
  635. self[date(year, 4, 9)] = name
  636. # Labor Day
  637. name = "Labor Day"
  638. self[date(year, 5, 1)] = name
  639. # Independence Day
  640. name = "Independence Day"
  641. self[date(year, 6, 12)] = name
  642. # Eid al-Fitr
  643. name = "Eid al-Fitr"
  644. islam_year = from_gregorian(year, 6, 15)[0]
  645. y1, m1, d1 = to_gregorian(islam_year, 10, 1)
  646. self[date(year, m1, d1) - timedelta(days=1)] = name
  647. # Eid al-Adha, i.e., Feast of the Sacrifice
  648. name = "Feast of the Sacrifice"
  649. islam_year = from_gregorian(year, 8, 22)[0]
  650. y, m, d = to_gregorian(islam_year, 12, 10)
  651. self[date(year, m, d)] = name
  652. # National Heroes' Day
  653. name = "National Heroes' Day"
  654. self[date(year, 8, 27)] = name
  655. # Bonifacio Day
  656. name = "Bonifacio Day"
  657. self[date(year, 11, 30)] = name
  658. # Christmas Day
  659. name = "Christmas Day"
  660. self[date(year, 12, 25)] = name
  661. # Rizal Day
  662. name = "Rizal Day"
  663. self[date(year, 12, 30)] = name
  664. class PH(Philippines):
  665. pass
  666. # ------------ Holidays in Turkey---------------------
  667. class Turkey(HolidayBase):
  668. """
  669. Implement public holidays in Turkey
  670. Reference:
  671. https://en.wikipedia.org/wiki/Public_holidays_in_Thailand
  672. """
  673. def __init__(self, **kwargs):
  674. self.country = "TU"
  675. HolidayBase.__init__(self, **kwargs)
  676. def _populate(self, year):
  677. # New Year's Day
  678. name = "New Year's Day"
  679. self[date(year, 1, 1)] = name
  680. # National Sovereignty and Children's Day
  681. name = "National Sovereignty and Children's Day "
  682. self[date(year, 4, 23)] = name
  683. # Labor Day
  684. name = "Labor Day"
  685. self[date(year, 5, 1)] = name
  686. # Commemoration of Atatürk, Youth and Sports Day
  687. name = "Commemoration of Atatürk, Youth and Sports Day"
  688. self[date(year, 5, 19)] = name
  689. # Democracy and National Unity Day
  690. name = "Democracy and National Unity Day"
  691. self[date(year, 7, 15)] = name
  692. # Victory Day
  693. name = "Victory Day"
  694. self[date(year, 8, 30)] = name
  695. # Republic Day
  696. name = "Republic Day"
  697. self[date(year, 10, 29)] = name
  698. # Eid al-Fitr
  699. name = "Eid al-Fitr"
  700. islam_year = from_gregorian(year, 6, 15)[0]
  701. y1, m1, d1 = to_gregorian(islam_year, 10, 1)
  702. self[date(year, m1, d1) - timedelta(days=1)] = name
  703. # Eid al-Adha, i.e., Feast of the Sacrifice
  704. name = "Feast of the Sacrifice"
  705. islam_year = from_gregorian(year, 8, 22)[0]
  706. y, m, d = to_gregorian(islam_year, 12, 10)
  707. self[date(year, m, d)] = name
  708. class TU(Turkey):
  709. pass
  710. # ------------ Holidays in Pakistan---------------------
  711. class Pakistan(HolidayBase):
  712. """
  713. Implement public holidays in Pakistan
  714. Reference:
  715. https://en.wikipedia.org/wiki/Public_holidays_in_Pakistan
  716. """
  717. def __init__(self, **kwargs):
  718. self.country = "PK"
  719. HolidayBase.__init__(self, **kwargs)
  720. def _populate(self, year):
  721. # Kashmir Solidarity Day
  722. name = "Kashmir Solidarity Day"
  723. self[date(year, 2, 5)] = name
  724. # Pakistan Day
  725. name = "Pakistan Day"
  726. self[date(year, 3, 23)] = name
  727. # Labor Day
  728. name = "Labor Day"
  729. self[date(year, 5, 1)] = name
  730. # Independence Day
  731. name = "Independence Day"
  732. self[date(year, 8, 14)] = name
  733. # Iqbal Day
  734. name = "Iqbal Day"
  735. self[date(year, 11, 9)] = name
  736. # Christmas Day
  737. # Also birthday of PK founder
  738. name = "Christmas Day"
  739. self[date(year, 12, 25)] = name
  740. # Eid al-Adha, i.e., Feast of the Sacrifice
  741. name = "Feast of the Sacrifice"
  742. islam_year = from_gregorian(year, 8, 22)[0]
  743. y1, m1, d1 = to_gregorian(islam_year, 12, 10)
  744. y2, m2, d2 = to_gregorian(islam_year, 12, 11)
  745. y3, m3, d3 = to_gregorian(islam_year, 12, 12)
  746. self[date(year, m1, d1)] = name
  747. self[date(year, m2, d2)] = name
  748. self[date(year, m3, d3)] = name
  749. # Eid al-Fitr
  750. name = "Eid al-Fitr"
  751. islam_year = from_gregorian(year, 6, 15)[0]
  752. y1, m1, d1 = to_gregorian(islam_year, 10, 1)
  753. y2, m2, d2 = to_gregorian(islam_year, 10, 2)
  754. y3, m3, d3 = to_gregorian(islam_year, 10, 3)
  755. self[date(year, m1, d1)] = name
  756. self[date(year, m2, d2)] = name
  757. self[date(year, m3, d3)] = name
  758. # Mawlid, Birth of the Prophet
  759. # 12th day of 3rd Islamic month
  760. islam_year = from_gregorian(year, 11, 20)[0]
  761. y, m, d = to_gregorian(islam_year, 3, 12)
  762. name = "Mawlid"
  763. self[date(y, m, d)] = name
  764. # Day of Ashura
  765. # 10th and 11th days of 1st Islamic month
  766. islam_year = from_gregorian(year, 10, 1)[0]
  767. y1, m1, d1 = to_gregorian(islam_year, 1, 10)
  768. y2, m2, d2 = to_gregorian(islam_year, 1, 11)
  769. name = "Day of Ashura"
  770. self[date(year, m1, d1)] = name
  771. self[date(year, m2, d2)] = name
  772. # Shab e Mairaj
  773. islam_year = from_gregorian(year, 4, 13)[0]
  774. y1, m1, d1 = to_gregorian(islam_year, 7, 27)
  775. name = "Shab e Mairaj"
  776. self[date(year, m1, d1)] = name
  777. # Defence Day
  778. name = "Defence Day"
  779. self[date(year, 9, 6)] = name
  780. # Death Anniversary of Quaid-e-Azam
  781. name = "Death Anniversary of Quaid-e-Azam"
  782. self[date(year, 9, 11)] = name
  783. class PK(Pakistan):
  784. pass
  785. # ------------ Holidays in Bangladesh---------------------
  786. class Bangladesh(HolidayBase):
  787. """
  788. Implement public holidays in Bangladesh
  789. Reference:
  790. https://en.wikipedia.org/wiki/Public_holidays_in_Bangladesh
  791. """
  792. def __init__(self, **kwargs):
  793. self.country = "BD"
  794. HolidayBase.__init__(self, **kwargs)
  795. def _populate(self, year):
  796. # Language Martyrs' Day
  797. name = "Language Martyrs' Day"
  798. self[date(year, 2, 21)] = name
  799. # Mujib's birthday
  800. name = "Mujib's birthday"
  801. self[date(year, 3, 17)] = name
  802. # Independence Day
  803. name = "Independence Day"
  804. self[date(year, 3, 26)] = name
  805. # Bengali New Year's Day
  806. name = "Bengali New Year's Day"
  807. self[date(year, 4, 14)] = name
  808. # Labor Day, May Day (local name)
  809. name = "Labor Day"
  810. self[date(year, 5, 1)] = name
  811. # National Mourning Day
  812. name = "National Mourning Day"
  813. self[date(year, 8, 15)] = name
  814. # Victory Day
  815. name = "Victory Day"
  816. self[date(year, 12, 16)] = name
  817. class BD(Bangladesh):
  818. pass
  819. # ------------ Holidays in Egypt---------------------
  820. class Egypt(HolidayBase):
  821. """
  822. Implement public holidays in Egypt
  823. Reference:
  824. https://en.wikipedia.org/wiki/Public_holidays_in_Egypt
  825. """
  826. def __init__(self, **kwargs):
  827. self.country = "EG"
  828. HolidayBase.__init__(self, **kwargs)
  829. def _populate(self, year):
  830. # Fixed holidays
  831. # Christmas
  832. name = "Christmas"
  833. self[date(year, 1, 7)] = name
  834. # Revolution Day, after 2011
  835. name = "Revolution Day 2011"
  836. if year <= 2011:
  837. self[date(year, 1, 25)] = name
  838. # Sinai Liberation Day, after 1982
  839. name = "Sinai Liberation Day"
  840. if year <= 1982:
  841. self[date(year, 4, 25)] = name
  842. # Labor Day
  843. name = "Labor Day"
  844. self[date(year, 5, 1)] = name
  845. # Revolution Day
  846. name = "Sinai Liberation Day"
  847. self[date(year, 7, 23)] = name
  848. # Armed Forces Day
  849. name = "Armed Forces Day"
  850. self[date(year, 10, 6)] = name
  851. # Sham El Nessim
  852. # The Monday following Orthodox Easter
  853. name = "Sham El Nessim"
  854. orthodox_easter = easter(year, method=2)
  855. self[orthodox_easter + timedelta(days=1)] = name
  856. # Islamic New Year
  857. islam_year = from_gregorian(year, 9, 11)[0]
  858. y, m, d = to_gregorian(islam_year + 1, 1, 1)
  859. name = "Islamic New Year"
  860. self[date(year, m, d)] = name
  861. # Birthday of Prophet, Mawlid in India
  862. # 12th day of 3rd Islamic month
  863. islam_year = from_gregorian(year, 11, 20)[0]
  864. y, m, d = to_gregorian(islam_year, 3, 12)
  865. name = "Birth of Prophet"
  866. self[date(y, m, d)] = name
  867. # Eid ul-Fitr
  868. # 1st and 2nd day of 10th Islamic month
  869. islam_year = from_gregorian(year, 6, 15)[0]
  870. y1, m1, d1 = to_gregorian(islam_year, 10, 1)
  871. y2, m2, d2 = to_gregorian(islam_year, 10, 2)
  872. y3, m3, d3 = to_gregorian(islam_year, 10, 3)
  873. name = "Eid al-Fitr"
  874. self[date(year, m1, d1)] = name
  875. self[date(year, m2, d2)] = name
  876. self[date(year, m3, d3)] = name
  877. # Eid al-Adha, i.e., Feast of the Sacrifice
  878. islam_year = from_gregorian(year, 8, 22)[0]
  879. y1, m1, d1 = to_gregorian(islam_year, 12, 10)
  880. y2, m2, d2 = to_gregorian(islam_year, 12, 11)
  881. y3, m3, d3 = to_gregorian(islam_year, 12, 12)
  882. y4, m4, d4 = to_gregorian(islam_year, 12, 13)
  883. name = "Feast of the Sacrifice"
  884. self[date(year, m1, d1)] = name
  885. self[date(year, m2, d2)] = name
  886. self[date(year, m3, d3)] = name
  887. self[date(year, m4, d4)] = name
  888. class EG(Egypt):
  889. pass
  890. # ------------ Holidays in China---------------------
  891. class China(HolidayBase):
  892. """
  893. Implement public holidays in China
  894. Reference:
  895. https://en.wikipedia.org/wiki/Public_holidays_in_China
  896. """
  897. def __init__(self, **kwargs):
  898. self.country = "CN"
  899. HolidayBase.__init__(self, **kwargs)
  900. def _populate(self, year):
  901. # New Year's Day
  902. name = "New Year's Day"
  903. self[date(year, 1, 1)] = name
  904. # Chinese New Year/ Spring Festival
  905. name = "Chinese New Year"
  906. self[LunarDate(year, 1, 1).toSolarDate()] = name
  907. # Tomb-Sweeping Day
  908. name = "Tomb-Sweeping Day"
  909. self[date(year, 4, 4)] = name
  910. self[date(year, 4, 5)] = name
  911. # Labor Day
  912. name = "Labor Day"
  913. self[date(year, 5, 1)] = name
  914. # Dragon Boat Festival
  915. name = "Dragon Boat Festival"
  916. self[LunarDate(year, 5, 5).toSolarDate()] = name
  917. # Mid-Autumn Festival
  918. name = "Mid-Autumn Festival"
  919. self[LunarDate(year, 8, 15).toSolarDate()] = name
  920. # National Day
  921. name = "National Day"
  922. self[date(year, 10, 1)] = name
  923. class CN(China):
  924. pass
  925. # ------------ Holidays in Russia---------------------
  926. class Russia(HolidayBase):
  927. """
  928. Implement public holidays in Russia
  929. Reference:
  930. https://en.wikipedia.org/wiki/Public_holidays_in_Russia
  931. Please note:
  932. Orthodox Christmas Day is official day off at Russia
  933. But the Dec. 25 Christmas is also celebrated.
  934. """
  935. def __init__(self, **kwargs):
  936. self.country = "RU"
  937. HolidayBase.__init__(self, **kwargs)
  938. def _populate(self, year):
  939. # New Year's Day
  940. name = "New Year's Day"
  941. self[date(year, 1, 1)] = name
  942. # Orthodox Christmas day
  943. name = "Orthodox Christmas Day"
  944. self[date(year, 1, 7)] = name
  945. # Dec. 25 Christmas Day
  946. name = "Christmas Day"
  947. self[date(year, 12, 25)] = name
  948. # Defender of the Fatherland Day
  949. name = "Defender of the Fatherland Day"
  950. self[date(year, 2, 23)] = name
  951. # International Women's Day
  952. name = "International Women's Day"
  953. self[date(year, 3, 8)] = name
  954. # National Flag Day
  955. name = "National Flag Day"
  956. self[date(year, 8, 22)] = name
  957. # Spring and Labour Day
  958. name = "Spring and Labour Day"
  959. self[date(year, 5, 1)] = name
  960. # Victory Day
  961. name = "Victory Day"
  962. self[date(year, 5, 9)] = name
  963. # Russia Day
  964. name = "Russia Day"
  965. self[date(year, 6, 12)] = name
  966. # Unity Day
  967. name = "Unity Day"
  968. self[date(year, 11, 4)] = name
  969. class RU(Russia):
  970. pass