| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347 |
- # Copyright (c) 2017-present, Facebook, Inc.
- # All rights reserved.
- #
- # This source code is licensed under the BSD-style license found in the
- # LICENSE file in the root directory of this source tree. An additional grant
- # of patent rights can be found in the PATENTS file in the same directory.
- from __future__ import absolute_import
- from __future__ import division
- from __future__ import print_function
- from __future__ import unicode_literals
- from holidays import HolidayBase, MONDAY, WEEKEND, rd, easter
- from lunardate import LunarDate
- from calendar import Calendar
- from datetime import date, timedelta
- from convertdate.islamic import to_gregorian, from_gregorian
- import warnings
- # Official public holidays at a country level
- # ------------ Holidays in Brazil---------------------
- class Brazil(HolidayBase):
- """
- Implement public holidays in Brazil
- Reference:
- https://en.wikipedia.org/wiki/Public_holidays_in_Brazil
- """
- def __init__(self, **kwargs):
- self.country = "BR"
- HolidayBase.__init__(self, **kwargs)
- def _populate(self, year):
- # New Year's Day
- if not self.observed and date(year, 1, 1).weekday() in WEEKEND:
- pass
- else:
- self[date(year, 1, 1)] = "New Year's Day"
- # Tiradentes
- self[date(year, 4, 21)] = "Tiradentes"
- # Worker's Day
- self[date(year, 5, 1)] = "Worker's Day"
- # Independence Day
- self[date(year, 9, 7)] = "Independence Day"
- # Our Lady of the Apparition
- self[date(year, 10, 12)] = "Our Lady of the Apparition"
- # All Souls' Day
- self[date(year, 11, 2)] = "All Souls' Day"
- # Republic Proclamation Day
- self[date(year, 11, 5)] = "Republic Proclamation Day"
- # Christmas
- self[date(year, 12, 25)] = "Christmas"
- class BR(Brazil):
- pass
- # ------------ Holidays in Indonesia---------------------
- class Indonesia(HolidayBase):
- """
- Implement public holidays in Indonesia
- Reference:
- https://en.wikipedia.org/wiki/Public_holidays_in_Indonesia
- Please note: Indonesia is a multi-cultural community and we only implement
- the national wide public holidays.
- """
- def __init__(self, **kwargs):
- self.country = "ID"
- HolidayBase.__init__(self, **kwargs)
- def _populate(self, year):
- # New Year's Day
- if not self.observed and date(year, 1, 1).weekday() in WEEKEND:
- pass
- else:
- self[date(year, 1, 1)] = "New Year's Day"
- # Chinese New Year/ Spring Festival
- name = "Chinese New Year"
- for offset in range(-1, 2, 1):
- ds = LunarDate(year + offset, 1, 1).toSolarDate()
- if ds.year == year:
- self[ds] = name
- # Day of Silence / Nyepi
- # Note:
- # This holiday is determined by Balinese calendar, which is not currently
- # available. Only hard coded version of this holiday from 2009 to 2019
- # is available.
- warning_msg = "We only support Nyepi holiday from 2009 to 2019"
- warnings.warn(warning_msg, Warning)
- name = "Day of Silence/ Nyepi"
- if year == 2009:
- self[date(year, 3, 26)] = name
- elif year == 2010:
- self[date(year, 3, 16)] = name
- elif year == 2011:
- self[date(year, 3, 5)] = name
- elif year == 2012:
- self[date(year, 3, 23)] = name
- elif year == 2013:
- self[date(year, 3, 12)] = name
- elif year == 2014:
- self[date(year, 3, 31)] = name
- elif year == 2015:
- self[date(year, 3, 21)] = name
- elif year == 2016:
- self[date(year, 3, 9)] = name
- elif year == 2017:
- self[date(year, 3, 28)] = name
- elif year == 2018:
- self[date(year, 3, 17)] = name
- elif year == 2019:
- self[date(year, 3, 7)] = name
- else:
- pass
- # Ascension of the Prophet
- name = "Ascension of the Prophet"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 3, 17)[0]
- y, m, d = to_gregorian(islam_year, 7, 27)
- if y == year:
- self[date(y, m, d)] = name
- # Labor Day
- name = "Labor Day"
- self[date(year, 5, 1)] = name
- # Ascension of Jesus Christ
- name = "Ascension of Jesus"
- for offset in range(-1, 2, 1):
- ds = easter(year + offset) + rd(days=+39)
- if ds.year == year:
- self[ds] = name
- # Buddha's Birthday
- name = "Buddha's Birthday"
- for offset in range(-1, 2, 1):
- ds = LunarDate(year + offset, 4, 15).toSolarDate()
- if ds.year == year:
- self[ds] = name
- # Pancasila Day, since 2017
- if year >= 2017:
- name = "Pancasila Day"
- self[date(year, 6, 1)] = name
- # Eid al-Fitr
- name = "Eid al-Fitr"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 6, 15)[0]
- y1, m1, d1 = to_gregorian(islam_year, 10, 1)
- y2, m2, d2 = to_gregorian(islam_year, 10, 2)
- if y1 == year:
- self[date(y1, m2, d2)] = name
- if y2 == year:
- self[date(y2, m2, d2)] = name
- # Independence Day
- name = "Independence Day"
- self[date(year, 8, 17)] = name
- # Feast of the Sacrifice
- name = "Feast of the Sacrifice"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 8, 22)[0]
- y, m, d = to_gregorian(islam_year, 12, 10)
- if y == year:
- self[date(y, m, d)] = name
- # Islamic New Year
- name = "Islamic New Year"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 9, 11)[0]
- y, m, d = to_gregorian(islam_year + 1, 1, 1)
- if y == year:
- self[date(y, m, d)] = name
- # Birth of the Prophet
- name = "Birth of the Prophet"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 11, 20)[0]
- y, m, d = to_gregorian(islam_year + 1, 3, 12)
- if y == year:
- self[date(y, m, d)] = name
- # Christmas
- self[date(year, 12, 25)] = "Christmas"
- class ID(Indonesia):
- pass
- # ------------ Holidays in India---------------------
- class India(HolidayBase):
- """
- Implement public holidays in India
- Reference:
- https://en.wikipedia.org/wiki/Public_holidays_in_India
- Please note:
- India is a culturally diverse and fervent society, celebrate various
- holidays and festivals. We only implement the holidays that **all states
- and territories** celebrate.
- """
- def __init__(self, **kwargs):
- self.country = "IN"
- HolidayBase.__init__(self, **kwargs)
- def _populate(self, year):
- # --------------------------------
- # Three national days
- # Republic Day
- # Independence Day
- # Gandhi Jayanti
- # --------------------------------
- # Republic Day
- name = "Republic Day"
- self[date(year, 1, 26)] = name
- # Independence Day
- name = "Independence Day"
- self[date(year, 8, 15)] = name
- # Gandhi Jayanti
- name = "Gandhi Jayanti"
- self[date(year, 10, 2)] = name
- # --------------------------------
- # Hindo holidays
- # Diwali
- # Holi
- # --------------------------------
- # Diwali, Holi
- # http://www.theholidayspot.com/diwali/calendar.htm
- # https://www.timeanddate.com/holidays/india/diwali?starty=
- # https://www.infoplease.com/calendar-holidays/major-holidays/
- warning_msg = "We only support Diwali and Holi holidays from 2010 to 2025"
- warnings.warn(warning_msg, Warning)
- name1 = "Diwali"
- name2 = "Holi"
- if year == 2010:
- self[date(year, 12, 5)] = name1
- self[date(year, 2, 28)] = name2
- elif year == 2011:
- self[date(year, 10, 26)] = name1
- self[date(year, 3, 19)] = name2
- elif year == 2012:
- self[date(year, 11, 13)] = name1
- self[date(year, 3, 8)] = name2
- elif year == 2013:
- self[date(year, 11, 3)] = name1
- self[date(year, 3, 26)] = name2
- elif year == 2014:
- self[date(year, 10, 23)] = name1
- self[date(year, 3, 17)] = name2
- elif year == 2015:
- self[date(year, 11, 11)] = name1
- self[date(year, 3, 6)] = name2
- elif year == 2016:
- self[date(year, 10, 30)] = name1
- self[date(year, 3, 24)] = name2
- elif year == 2017:
- self[date(year, 10, 19)] = name1
- self[date(year, 3, 13)] = name2
- elif year == 2018:
- self[date(year, 11, 7)] = name1
- self[date(year, 3, 2)] = name2
- elif year == 2019:
- self[date(year, 10, 27)] = name1
- self[date(year, 3, 21)] = name2
- elif year == 2020:
- self[date(year, 11, 14)] = name1
- self[date(year, 3, 9)] = name2
- elif year == 2021:
- self[date(year, 11, 4)] = name1
- self[date(year, 3, 28)] = name2
- elif year == 2022:
- self[date(year, 10, 24)] = name1
- self[date(year, 3, 18)] = name2
- elif year == 2023:
- self[date(year, 10, 12)] = name1
- self[date(year, 3, 7)] = name2
- elif year == 2024:
- self[date(year, 11, 1)] = name1
- self[date(year, 3, 25)] = name2
- elif year == 2025:
- self[date(year, 10, 21)] = name1
- self[date(year, 3, 14)] = name2
- else:
- pass
- # --------------------------------
- # Islamic holidays
- # Day of Ashura
- # Mawlid
- # Eid ul-Fitr
- # Eid al-Adha
- # --------------------------------
- # Day of Ashura
- # 10th day of 1st Islamic month
- name = "Day of Ashura"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 10, 1)[0]
- y, m, d = to_gregorian(islam_year, 1, 10)
- if y == year:
- self[date(y, m, d)] = name
- # Mawlid, Birth of the Prophet
- # 12th day of 3rd Islamic month
- name = "Mawlid"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 11, 20)[0]
- y, m, d = to_gregorian(islam_year, 3, 12)
- if y == year:
- self[date(y, m, d)] = name
- # Eid ul-Fitr
- # 1st and 2nd day of 10th Islamic month
- name = "Eid al-Fitr"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 6, 15)[0]
- y1, m1, d1 = to_gregorian(islam_year, 10, 1)
- y2, m2, d2 = to_gregorian(islam_year, 10, 2)
- if y1 == year:
- self[date(y1, m1, d1)] = name
- if y2 == year:
- self[date(y2, m2, d2)] = name
- # Eid al-Adha, i.e., Feast of the Sacrifice
- name = "Feast of the Sacrifice"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 8, 22)[0]
- y, m, d = to_gregorian(islam_year, 12, 10)
- if y == year:
- self[date(y, m, d)] = name
- # --------------------------------
- # Christian holidays
- # New Year, Palm Sunday,
- # Maundy Thursday
- # Good Friday
- # Easter Sunday
- # Feast of Pentecost
- # Fest of St. Theresa of Calcutta
- # Feast of the Blessed Virgin
- # All Saints Day
- # All Souls Day
- # Christmas Day
- # Boxing Day
- # Feast of Holy Family
- # --------------------------------
- # New Year's Day
- self[date(year, 1, 1)] = "New Year's Day"
- # Palm Sunday
- name = "Palm Sunday"
- for offset in range(-1, 2, 1):
- ds = easter(year + offset) - rd(days=7)
- if ds.year == year:
- self[ds] = name
- # Maundy Thursday
- name = "Maundy Thursday"
- for offset in range(-1, 2, 1):
- ds = easter(year + offset) - rd(days=3)
- if ds.year == year:
- self[ds] = name
- # Good Friday
- name = "Good Friday"
- for offset in range(-1, 2, 1):
- ds = easter(year + offset) - rd(days=2)
- if ds.year == year:
- self[ds] = name
- # Easter Sunday
- name = "Easter Sunday"
- for offset in range(-1, 2, 1):
- ds = easter(year + offset)
- if ds.year == year:
- self[ds] = name
- # Feast of Pentecost
- name = "Feast of Pentecost"
- for offset in range(-1, 2, 1):
- ds = easter(year + offset) + rd(days=49)
- if ds.year == year:
- self[ds] = name
- # Fest of St. Theresa of Calcutta
- name = "Fest of St. Theresa of Calcutta"
- self[date(year, 9, 5)] = name
- # Feast of the Blessed Virgin
- name = "Feast of the Blessed Virgin"
- self[date(year, 9, 8)] = name
- # All Saints Day
- name = "All Saints Day"
- self[date(year, 11, 1)] = name
- # All Souls Day
- name = "All Souls Day"
- self[date(year, 11, 2)] = name
- # Christmas
- name = "Christmas Day"
- self[date(year, 12, 25)] = name
- # Boxing Day
- name = "Boxing Day"
- self[date(year, 12, 26)] = name
- # Feast of Holy Family
- name = "Feast of Holy Family"
- self[date(year, 12, 30)] = name
- class IN(India):
- pass
- # ------------ Holidays in Malaysia---------------------
- class Malaysia(HolidayBase):
- """
- Implement public holidays in Malaysia
- Reference:
- https://en.wikipedia.org/wiki/Public_holidays_in_Malaysia
- """
- def __init__(self, **kwargs):
- self.country = "MY"
- HolidayBase.__init__(self, **kwargs)
- def _populate(self, year):
- # New Year's Day
- name = "New Year's Day"
- self[date(year, 1, 1)] = name
- # Birthday of Prophet, Mawlid in India
- # 12th day of 3rd Islamic month
- name = "Birth of Prophet"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 11, 20)[0]
- y, m, d = to_gregorian(islam_year, 3, 12)
- if y == year:
- self[date(y, m, d)] = name
- # Chinese New Year
- name = "Chinese New Year"
- for offset in range(-1, 2, 1):
- ds = LunarDate(year + offset, 1, 1).toSolarDate()
- if ds.year == year:
- self[ds] = name
- # Tamil New Year
- # Note: it's not necessarily 04/14
- # due to the local calendar
- # other possible dates are 04/13 and 04/15
- name = "Tamil New Year"
- self[date(year, 4, 14)] = name
- # Good Friday
- name = "Good Friday"
- for offset in range(-1, 2, 1):
- ds = easter(year + offset) - rd(days=2)
- if ds.year == year:
- self[ds] = name
- # Labor Day
- name = "Labor Day"
- self[date(year, 5, 1)] = name
- # Buddha's Birthday
- name = "Wesak Day"
- for offset in range(-1, 2, 1):
- ds = LunarDate(year + offset, 4, 15).toSolarDate()
- if ds.year == year:
- self[ds] = name
- # King's birthday
- # https://www.thestar.com.my/news/nation/2017/04/26/
- # Before 2017: first Saturday of June
- # 2017-2021: last Saturday of July
- name = "King's birthday"
- if year < 2017:
- c = Calendar(firstweekday=MONDAY)
- monthcal = c.monthdatescalendar(year, 6)
- l1 = len(monthcal)
- saturdays = []
- for i in range(l1):
- if monthcal[i][5].month == 6:
- saturdays.append(monthcal[i][5])
- self[saturdays[0]] = name
- elif (year >= 2017) and (year <= 2021):
- c = Calendar(firstweekday=MONDAY)
- monthcal = c.monthdatescalendar(year, 7)
- l1 = len(monthcal)
- saturdays = []
- for i in range(l1):
- if monthcal[i][5].month == 7:
- saturdays.append(monthcal[i][5])
- self[saturdays[-1]] = name
- # Eid al-Fitr
- name = "Eid al-Fitr"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 6, 15)[0]
- y1, m1, d1 = to_gregorian(islam_year, 10, 1)
- y2, m2, d2 = to_gregorian(islam_year, 10, 2)
- if y1 == year:
- self[date(y1, m1, d1)] = name
- if y2 == year:
- self[date(y2, m2, d2)] = name
- # Malaysia Day
- name = "Malaysia Day"
- self[date(year, 9, 16)] = name
- # Feast of the Sacrifice
- name = "Feast of the Sacrifice"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 8, 22)[0]
- y, m, d = to_gregorian(islam_year, 12, 10)
- if y == year:
- self[date(y, m, d)] = name
- # First Day of Muharram
- name = "First Day of Muharram"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 9, 11)[0]
- y, m, d = to_gregorian(islam_year + 1, 1, 1)
- if y == year:
- self[date(y, m, d)] = name
- # Christmas
- name = "Christmas Day"
- self[date(year, 12, 25)] = name
- class MY(Malaysia):
- pass
- # ------------ Holidays in Vietnam---------------------
- class Vietnam(HolidayBase):
- """
- Implement public holidays in Vietnam
- Reference:
- https://en.wikipedia.org/wiki/Public_holidays_in_Vietnam
- """
- def __init__(self, **kwargs):
- self.country = "VN"
- HolidayBase.__init__(self, **kwargs)
- def _populate(self, year):
- # New Year's Day
- name = "New Year's Day"
- self[date(year, 1, 1)] = name
- # Vietnamese New Year
- name = "Vietnamese New Year"
- for offset in range(-1, 2, 1):
- try:
- ds = LunarDate(year - 1 + offset, 12, 30).toSolarDate()
- except ValueError:
- ds = LunarDate(year - 1 + offset, 12, 29).toSolarDate()
- if ds.year == year:
- self[ds] = name
- ds = LunarDate(year + offset, 1, 1).toSolarDate()
- if ds.year == year:
- self[ds] = name
- ds = LunarDate(year + offset, 1, 2).toSolarDate()
- if ds.year == year:
- self[ds] = name
- ds = LunarDate(year + offset, 1, 3).toSolarDate()
- if ds.year == year:
- self[ds] = name
- ds = LunarDate(year + offset, 1, 4).toSolarDate()
- if ds.year == year:
- self[ds] = name
- ds = LunarDate(year + offset, 1, 5).toSolarDate()
- if ds.year == year:
- self[ds] = name
- # Hung Kings Commemorations
- name = "Hung Kings Commemorations"
- for offset in range(-1, 2, 1):
- ds = LunarDate(year + offset, 3, 10).toSolarDate()
- if ds.year == year:
- self[ds] = name
- # Reunification Day
- name = "Reunification Day"
- self[date(year, 4, 30)] = name
- # Labor Day/International Workers' Day
- name = "Labor Day/International Workers' Day"
- self[date(year, 5, 1)] = name
- # National Day
- name = "National Day"
- self[date(year, 9, 2)] = name
- class VN(Vietnam):
- pass
- # ------------ Holidays in Thailand---------------------
- class Thailand(HolidayBase):
- """
- Implement public holidays in Thailand
- Reference:
- https://en.wikipedia.org/wiki/Public_holidays_in_Thailand
- """
- def __init__(self, **kwargs):
- self.country = "TH"
- HolidayBase.__init__(self, **kwargs)
- def _populate(self, year):
- # New Year's Day
- name = "New Year's Day"
- self[date(year, 1, 1)] = name
- # Magha Pujab
- # Note:
- # This holiday is determined by Buddhist calendar, which is not currently
- # available. Only hard coded version of this holiday from 2016 to 2019
- # is available.
- name = "Magha Pujab/Makha Bucha"
- if year == 2016:
- self[date(year, 2, 22)] = name
- elif year == 2017:
- self[date(year, 2, 11)] = name
- elif year == 2018:
- self[date(year, 3, 1)] = name
- elif year == 2019:
- self[date(year, 2, 19)] = name
- else:
- pass
- # Chakri Memorial Day
- name = "Chakri Memorial Day"
- april_6 = date(year, 4, 6).weekday()
- if april_6 == 5:
- self[date(year, 4, 6 + 2)] = name
- elif april_6 == 6:
- self[date(year, 4, 6 + 1)] = name
- else:
- self[date(year, 4, 6)] = name
- # Songkran Festival
- name = "Songkran Festival"
- self[date(year, 4, 14)] = name
- # Royal Ploughing Ceremony
- # arbitrary day in May
- # Buddha's Birthday
- name = "Buddha's Birthday"
- for offset in range(-1, 2, 1):
- ds = LunarDate(year + offset, 4, 15).toSolarDate()
- if ds.year == year:
- self[ds] = name
- # Coronation Day, removed in 2017
- name = "Coronation Day"
- if year < 2017:
- self[date(year, 5, 5)] = name
- # King Maha Vajiralongkorn's Birthday
- name = "King Maha Vajiralongkorn's Birthday"
- self[date(year, 7, 28)] = name
- # Asalha Puja
- # This is also a Buddha holiday, and we only implement
- # the hard coded version from 2006 to 2025
- # reference:
- # http://www.when-is.com/asalha_puja.asp
- warning_msg = "We only support Asalha Puja holiday from 2006 to 2025"
- warnings.warn(warning_msg, Warning)
- name = "Asalha Puja"
- if year == 2006:
- self[date(year, 7, 11)] = name
- elif year == 2007:
- self[date(year, 6, 30)] = name
- elif year == 2008:
- self[date(year, 7, 18)] = name
- elif year == 2009:
- self[date(year, 7, 7)] = name
- elif year == 2010:
- self[date(year, 7, 25)] = name
- elif year == 2011:
- self[date(year, 7, 15)] = name
- elif year == 2012:
- self[date(year, 8, 2)] = name
- elif year == 2013:
- self[date(year, 7, 30)] = name
- elif year == 2014:
- self[date(year, 7, 13)] = name
- elif year == 2015:
- self[date(year, 7, 30)] = name
- elif year == 2016:
- self[date(year, 7, 15)] = name
- elif year == 2017:
- self[date(year, 7, 9)] = name
- elif year == 2018:
- self[date(year, 7, 29)] = name
- elif year == 2019:
- self[date(year, 7, 16)] = name
- elif year == 2020:
- self[date(year, 7, 5)] = name
- elif year == 2021:
- self[date(year, 7, 24)] = name
- elif year == 2022:
- self[date(year, 7, 13)] = name
- elif year == 2023:
- self[date(year, 7, 3)] = name
- elif year == 2024:
- self[date(year, 7, 21)] = name
- elif year == 2025:
- self[date(year, 7, 10)] = name
- else:
- pass
- # Beginning of Vassa
- warning_msg = "We only support Vassa holiday from 2006 to 2020"
- warnings.warn(warning_msg, Warning)
- name = "Beginning of Vassa"
- if year == 2006:
- self[date(year, 7, 12)] = name
- elif year == 2007:
- self[date(year, 7, 31)] = name
- elif year == 2008:
- self[date(year, 7, 19)] = name
- elif year == 2009:
- self[date(year, 7, 8)] = name
- elif year == 2010:
- self[date(year, 7, 27)] = name
- elif year == 2011:
- self[date(year, 7, 16)] = name
- elif year == 2012:
- self[date(year, 8, 3)] = name
- elif year == 2013:
- self[date(year, 7, 23)] = name
- elif year == 2014:
- self[date(year, 7, 13)] = name
- elif year == 2015:
- self[date(year, 8, 1)] = name
- elif year == 2016:
- self[date(year, 7, 20)] = name
- elif year == 2017:
- self[date(year, 7, 9)] = name
- elif year == 2018:
- self[date(year, 7, 28)] = name
- elif year == 2019:
- self[date(year, 7, 17)] = name
- elif year == 2020:
- self[date(year, 7, 6)] = name
- else:
- pass
- # The Queen Sirikit's Birthday
- name = "The Queen Sirikit's Birthday"
- self[date(year, 8, 12)] = name
- # Anniversary for the Death of King Bhumibol Adulyadej
- name = "Anniversary for the Death of King Bhumibol Adulyadej"
- self[date(year, 10, 13)] = name
- # King Chulalongkorn Day
- name = "King Chulalongkorn Day"
- self[date(year, 10, 23)] = name
- # King Bhumibol Adulyadej's Birthday Anniversary
- name = "King Bhumibol Adulyadej's Birthday Anniversary"
- self[date(year, 12, 5)] = name
- # Constitution Day
- name = "Constitution Day"
- self[date(year, 12, 10)] = name
- # New Year's Eve
- name = "New Year's Eve"
- self[date(year, 12, 31)] = name
- class TH(Thailand):
- pass
- # ------------ Holidays in Philippines---------------------
- class Philippines(HolidayBase):
- """
- Implement public holidays in Philippines
- Reference:
- https://en.wikipedia.org/wiki/Public_holidays_in_Thailand
- """
- def __init__(self, **kwargs):
- self.country = "PH"
- HolidayBase.__init__(self, **kwargs)
- def _populate(self, year):
- # New Year's Day
- name = "New Year's Day"
- self[date(year, 1, 1)] = name
- # Maundy Thursday
- name = "Maundy Thursday"
- for offset in range(-1, 2, 1):
- ds = easter(year + offset) - rd(days=3)
- if ds.year == year:
- self[ds] = name
- # Good Friday
- name = "Good Friday"
- for offset in range(-1, 2, 1):
- ds = easter(year + offset) - rd(days=2)
- if ds.year == year:
- self[ds] = name
- # Day of Valor
- name = "Day of Valor"
- self[date(year, 4, 9)] = name
- # Labor Day
- name = "Labor Day"
- self[date(year, 5, 1)] = name
- # Independence Day
- name = "Independence Day"
- self[date(year, 6, 12)] = name
- # Eid al-Fitr
- name = "Eid al-Fitr"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 6, 15)[0]
- y, m, d = to_gregorian(islam_year, 10, 1)
- ds = date(y, m, d) - timedelta(days=1)
- if ds.year == year:
- self[ds] = name
- # Eid al-Adha, i.e., Feast of the Sacrifice
- name = "Feast of the Sacrifice"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 8, 22)[0]
- y, m, d = to_gregorian(islam_year, 12, 10)
- if y == year:
- self[date(y, m, d)] = name
- # National Heroes' Day
- name = "National Heroes' Day"
- self[date(year, 8, 27)] = name
- # Bonifacio Day
- name = "Bonifacio Day"
- self[date(year, 11, 30)] = name
- # Christmas Day
- name = "Christmas Day"
- self[date(year, 12, 25)] = name
- # Rizal Day
- name = "Rizal Day"
- self[date(year, 12, 30)] = name
- class PH(Philippines):
- pass
- # ------------ Holidays in Turkey---------------------
- class Turkey(HolidayBase):
- """
- Implement public holidays in Turkey
- Reference:
- https://en.wikipedia.org/wiki/Public_holidays_in_Thailand
- """
- def __init__(self, **kwargs):
- self.country = "TU"
- HolidayBase.__init__(self, **kwargs)
- def _populate(self, year):
- # New Year's Day
- name = "New Year's Day"
- self[date(year, 1, 1)] = name
- # National Sovereignty and Children's Day
- name = "National Sovereignty and Children's Day "
- self[date(year, 4, 23)] = name
- # Labor Day
- name = "Labor Day"
- self[date(year, 5, 1)] = name
- # Commemoration of Atatürk, Youth and Sports Day
- name = "Commemoration of Atatürk, Youth and Sports Day"
- self[date(year, 5, 19)] = name
- # Democracy and National Unity Day
- name = "Democracy and National Unity Day"
- self[date(year, 7, 15)] = name
- # Victory Day
- name = "Victory Day"
- self[date(year, 8, 30)] = name
- # Republic Day
- name = "Republic Day"
- self[date(year, 10, 29)] = name
- # Eid al-Fitr
- name = "Eid al-Fitr"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 6, 15)[0]
- y, m, d = to_gregorian(islam_year, 10, 1)
- ds = date(y, m, d) - timedelta(days=1)
- if ds.year == year:
- self[ds] = name
- # Eid al-Adha, i.e., Feast of the Sacrifice
- name = "Feast of the Sacrifice"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 8, 22)[0]
- y, m, d = to_gregorian(islam_year, 12, 10)
- if y == year:
- self[date(y, m, d)] = name
- class TU(Turkey):
- pass
- # ------------ Holidays in Pakistan---------------------
- class Pakistan(HolidayBase):
- """
- Implement public holidays in Pakistan
- Reference:
- https://en.wikipedia.org/wiki/Public_holidays_in_Pakistan
- """
- def __init__(self, **kwargs):
- self.country = "PK"
- HolidayBase.__init__(self, **kwargs)
- def _populate(self, year):
- # Kashmir Solidarity Day
- name = "Kashmir Solidarity Day"
- self[date(year, 2, 5)] = name
- # Pakistan Day
- name = "Pakistan Day"
- self[date(year, 3, 23)] = name
- # Labor Day
- name = "Labor Day"
- self[date(year, 5, 1)] = name
- # Independence Day
- name = "Independence Day"
- self[date(year, 8, 14)] = name
- # Iqbal Day
- name = "Iqbal Day"
- self[date(year, 11, 9)] = name
- # Christmas Day
- # Also birthday of PK founder
- name = "Christmas Day"
- self[date(year, 12, 25)] = name
- # Eid al-Adha, i.e., Feast of the Sacrifice
- name = "Feast of the Sacrifice"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 8, 22)[0]
- y1, m1, d1 = to_gregorian(islam_year, 12, 10)
- y2, m2, d2 = to_gregorian(islam_year, 12, 11)
- y3, m3, d3 = to_gregorian(islam_year, 12, 12)
- if y1 == year:
- self[date(y1, m1, d1)] = name
- if y2 == year:
- self[date(y2, m2, d2)] = name
- if y3 == year:
- self[date(y3, m3, d3)] = name
- # Eid al-Fitr
- name = "Eid al-Fitr"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 6, 15)[0]
- y1, m1, d1 = to_gregorian(islam_year, 10, 1)
- y2, m2, d2 = to_gregorian(islam_year, 10, 2)
- y3, m3, d3 = to_gregorian(islam_year, 10, 3)
- if y1 == year:
- self[date(y1, m1, d1)] = name
- if y2 == year:
- self[date(y2, m2, d2)] = name
- if y3 == year:
- self[date(y3, m3, d3)] = name
- # Mawlid, Birth of the Prophet
- # 12th day of 3rd Islamic month
- name = "Mawlid"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 11, 20)[0]
- y, m, d = to_gregorian(islam_year, 3, 12)
- if y == year:
- self[date(y, m, d)] = name
- # Day of Ashura
- # 10th and 11th days of 1st Islamic month
- name = "Day of Ashura"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 10, 1)[0]
- y1, m1, d1 = to_gregorian(islam_year, 1, 10)
- y2, m2, d2 = to_gregorian(islam_year, 1, 11)
- if y1 == year:
- self[date(y1, m1, d1)] = name
- if y2 == year:
- self[date(y2, m2, d2)] = name
- # Shab e Mairaj
- name = "Shab e Mairaj"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 4, 13)[0]
- y, m, d = to_gregorian(islam_year, 7, 27)
- if y == year:
- self[date(y, m, d)] = name
- # Defence Day
- name = "Defence Day"
- self[date(year, 9, 6)] = name
- # Death Anniversary of Quaid-e-Azam
- name = "Death Anniversary of Quaid-e-Azam"
- self[date(year, 9, 11)] = name
- class PK(Pakistan):
- pass
- # ------------ Holidays in Bangladesh---------------------
- class Bangladesh(HolidayBase):
- """
- Implement public holidays in Bangladesh
- Reference:
- https://en.wikipedia.org/wiki/Public_holidays_in_Bangladesh
- """
- def __init__(self, **kwargs):
- self.country = "BD"
- HolidayBase.__init__(self, **kwargs)
- def _populate(self, year):
- # Language Martyrs' Day
- name = "Language Martyrs' Day"
- self[date(year, 2, 21)] = name
- # Mujib's birthday
- name = "Mujib's birthday"
- self[date(year, 3, 17)] = name
- # Independence Day
- name = "Independence Day"
- self[date(year, 3, 26)] = name
- # Bengali New Year's Day
- name = "Bengali New Year's Day"
- self[date(year, 4, 14)] = name
- # Labor Day, May Day (local name)
- name = "Labor Day"
- self[date(year, 5, 1)] = name
- # National Mourning Day
- name = "National Mourning Day"
- self[date(year, 8, 15)] = name
- # Victory Day
- name = "Victory Day"
- self[date(year, 12, 16)] = name
- class BD(Bangladesh):
- pass
- # ------------ Holidays in Egypt---------------------
- class Egypt(HolidayBase):
- """
- Implement public holidays in Egypt
- Reference:
- https://en.wikipedia.org/wiki/Public_holidays_in_Egypt
- """
- def __init__(self, **kwargs):
- self.country = "EG"
- HolidayBase.__init__(self, **kwargs)
- def _populate(self, year):
- # Fixed holidays
- # Christmas
- name = "Christmas"
- self[date(year, 1, 7)] = name
- # Revolution Day, after 2011
- name = "Revolution Day 2011"
- if year <= 2011:
- self[date(year, 1, 25)] = name
- # Sinai Liberation Day, after 1982
- name = "Sinai Liberation Day"
- if year <= 1982:
- self[date(year, 4, 25)] = name
- # Labor Day
- name = "Labor Day"
- self[date(year, 5, 1)] = name
- # Revolution Day
- name = "Sinai Liberation Day"
- self[date(year, 7, 23)] = name
- # Armed Forces Day
- name = "Armed Forces Day"
- self[date(year, 10, 6)] = name
- # Sham El Nessim
- # The Monday following Orthodox Easter
- name = "Sham El Nessim"
- for offset in range(-1, 2, 1):
- orthodox_easter = easter(year + offset, method=2)
- ds = orthodox_easter + timedelta(days=1)
- if ds.year == year:
- self[ds] = name
- # Islamic New Year
- name = "Islamic New Year"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 9, 11)[0]
- y, m, d = to_gregorian(islam_year + 1, 1, 1)
- if y == year:
- self[date(y, m, d)] = name
- # Birthday of Prophet, Mawlid in India
- # 12th day of 3rd Islamic month
- name = "Birth of Prophet"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 11, 20)[0]
- y, m, d = to_gregorian(islam_year, 3, 12)
- if y == year:
- self[date(y, m, d)] = name
- # Eid ul-Fitr
- # 1st and 2nd day of 10th Islamic month
- name = "Eid al-Fitr"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 6, 15)[0]
- y1, m1, d1 = to_gregorian(islam_year, 10, 1)
- y2, m2, d2 = to_gregorian(islam_year, 10, 2)
- y3, m3, d3 = to_gregorian(islam_year, 10, 3)
- if y1 == year:
- self[date(y1, m1, d1)] = name
- if y2 == year:
- self[date(y2, m2, d2)] = name
- if y3 == year:
- self[date(y3, m3, d3)] = name
- # Eid al-Adha, i.e., Feast of the Sacrifice
- name = "Feast of the Sacrifice"
- for offset in range(-1, 2, 1):
- islam_year = from_gregorian(year + offset, 8, 22)[0]
- y1, m1, d1 = to_gregorian(islam_year, 12, 10)
- y2, m2, d2 = to_gregorian(islam_year, 12, 11)
- y3, m3, d3 = to_gregorian(islam_year, 12, 12)
- y4, m4, d4 = to_gregorian(islam_year, 12, 13)
- if y1 == year:
- self[date(y1, m1, d1)] = name
- if y2 == year:
- self[date(y2, m2, d2)] = name
- if y3 == year:
- self[date(y3, m3, d3)] = name
- if y4 == year:
- self[date(y4, m4, d4)] = name
- class EG(Egypt):
- pass
- # ------------ Holidays in China---------------------
- class China(HolidayBase):
- """
- Implement public holidays in China
- Reference:
- https://en.wikipedia.org/wiki/Public_holidays_in_China
- """
- def __init__(self, **kwargs):
- self.country = "CN"
- HolidayBase.__init__(self, **kwargs)
- def _populate(self, year):
- # New Year's Day
- name = "New Year's Day"
- self[date(year, 1, 1)] = name
- # Chinese New Year/ Spring Festival
- name = "Chinese New Year"
- for offset in range(-1, 2, 1):
- ds = LunarDate(year + offset, 1, 1).toSolarDate()
- if ds.year == year:
- self[ds] = name
- # Tomb-Sweeping Day
- name = "Tomb-Sweeping Day"
- self[date(year, 4, 4)] = name
- self[date(year, 4, 5)] = name
- # Labor Day
- name = "Labor Day"
- self[date(year, 5, 1)] = name
- # Dragon Boat Festival
- name = "Dragon Boat Festival"
- for offset in range(-1, 2, 1):
- ds = LunarDate(year + offset, 5, 5).toSolarDate()
- if ds.year == year:
- self[ds] = name
- # Mid-Autumn Festival
- name = "Mid-Autumn Festival"
- for offset in range(-1, 2, 1):
- ds = LunarDate(year + offset, 8, 15).toSolarDate()
- if ds.year == year:
- self[ds] = name
- # National Day
- name = "National Day"
- self[date(year, 10, 1)] = name
- class CN(China):
- pass
- # ------------ Holidays in Russia---------------------
- class Russia(HolidayBase):
- """
- Implement public holidays in Russia
- Reference:
- https://en.wikipedia.org/wiki/Public_holidays_in_Russia
- Please note:
- Orthodox Christmas Day is official day off at Russia
- But the Dec. 25 Christmas is also celebrated.
- """
- def __init__(self, **kwargs):
- self.country = "RU"
- HolidayBase.__init__(self, **kwargs)
- def _populate(self, year):
- # New Year's Day
- name = "New Year's Day"
- self[date(year, 1, 1)] = name
- # Orthodox Christmas day
- name = "Orthodox Christmas Day"
- self[date(year, 1, 7)] = name
- # Dec. 25 Christmas Day
- name = "Christmas Day"
- self[date(year, 12, 25)] = name
- # Defender of the Fatherland Day
- name = "Defender of the Fatherland Day"
- self[date(year, 2, 23)] = name
- # International Women's Day
- name = "International Women's Day"
- self[date(year, 3, 8)] = name
- # National Flag Day
- name = "National Flag Day"
- self[date(year, 8, 22)] = name
- # Spring and Labour Day
- name = "Spring and Labour Day"
- self[date(year, 5, 1)] = name
- # Victory Day
- name = "Victory Day"
- self[date(year, 5, 9)] = name
- # Russia Day
- name = "Russia Day"
- self[date(year, 6, 12)] = name
- # Unity Day
- name = "Unity Day"
- self[date(year, 11, 4)] = name
- class RU(Russia):
- pass
|