429 lines
8.8 KiB
Python
429 lines
8.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
# This file is part of convertdate.
|
|
# http://github.com/fitnr/convertdate
|
|
|
|
# Licensed under the MIT license:
|
|
# http://opensource.org/licenses/MIT
|
|
# Copyright (c) 2016, fitnr <fitnr@fakeisthenewreal>
|
|
import time
|
|
import calendar
|
|
from math import trunc
|
|
from .utils import nth_day_of_month
|
|
from . import hebrew
|
|
|
|
# weekdays
|
|
MON = 0
|
|
TUE = 1
|
|
WED = 2
|
|
THU = 3
|
|
FRI = 4
|
|
SAT = 5
|
|
SUN = 6
|
|
|
|
# months
|
|
JAN = 1
|
|
FEB = 2
|
|
MAR = 3
|
|
APR = 4
|
|
MAY = 5
|
|
JUN = 6
|
|
JUL = 7
|
|
AUG = 8
|
|
SEP = 9
|
|
OCT = 10
|
|
NOV = 11
|
|
DEC = 12
|
|
|
|
|
|
def new_years(year):
|
|
'''Jan 1st'''
|
|
return (year, JAN, 1)
|
|
|
|
|
|
def martin_luther_king_day(year):
|
|
'''third monday in January'''
|
|
return nth_day_of_month(3, MON, JAN, year)
|
|
|
|
|
|
def lincolns_birthday(year):
|
|
'''Feb 12'''
|
|
return (year, FEB, 12)
|
|
|
|
|
|
def valentines_day(year):
|
|
'''feb 14th'''
|
|
return (year, FEB, 14)
|
|
|
|
|
|
def washingtons_birthday(year):
|
|
'''Feb 22'''
|
|
return (year, FEB, 22)
|
|
|
|
|
|
def presidents_day(year):
|
|
'''3rd Monday of Feb'''
|
|
return nth_day_of_month(3, MON, FEB, year)
|
|
|
|
|
|
def pulaski_day(year):
|
|
'''1st monday in March'''
|
|
return nth_day_of_month(1, MON, MAR, year)
|
|
|
|
|
|
def easter(year):
|
|
'''Calculate western easter'''
|
|
# formula taken from http://aa.usno.navy.mil/faq/docs/easter.html
|
|
c = trunc(year / 100)
|
|
n = year - 19 * trunc(year / 19)
|
|
|
|
k = trunc((c - 17) / 25)
|
|
|
|
i = c - trunc(c / 4) - trunc((c - k) / 3) + (19 * n) + 15
|
|
i = i - 30 * trunc(i / 30)
|
|
i = i - trunc(i / 28) * (1 - trunc(i / 28) * trunc(29 / (i + 1)) * trunc((21 - n) / 11))
|
|
|
|
j = year + trunc(year / 4) + i + 2 - c + trunc(c / 4)
|
|
j = j - 7 * trunc(j / 7)
|
|
|
|
l = i - j
|
|
|
|
month = 3 + trunc((l + 40) / 44)
|
|
day = l + 28 - 31 * trunc(month / 4)
|
|
|
|
return year, int(month), int(day)
|
|
|
|
|
|
def may_day(year):
|
|
return (year, MAY, 1)
|
|
|
|
|
|
def mothers_day(year):
|
|
'''2nd Sunday in May'''
|
|
return nth_day_of_month(2, SUN, MAY, year)
|
|
|
|
|
|
def memorial_day(year):
|
|
'''last Monday in May'''
|
|
return nth_day_of_month(0, MON, MAY, year)
|
|
|
|
|
|
def fathers_day(year):
|
|
'''3rd Sunday in June'''
|
|
return nth_day_of_month(3, SUN, JUN, year)
|
|
|
|
|
|
def flag_day(year):
|
|
'''June 14th'''
|
|
return (year, JUN, 14)
|
|
|
|
|
|
def independence_day(year, observed=None):
|
|
'''July 4th'''
|
|
day = 4
|
|
|
|
if observed:
|
|
if calendar.weekday(year, JUL, 4) == SAT:
|
|
day = 3
|
|
|
|
if calendar.weekday(year, JUL, 4) == SUN:
|
|
day = 5
|
|
|
|
return (year, JUL, day)
|
|
|
|
|
|
def labor_day(year):
|
|
'''first Monday in Sep'''
|
|
return nth_day_of_month(1, MON, SEP, year)
|
|
|
|
|
|
def columbus_day(year, country='usa'):
|
|
'''in USA: 2nd Monday in Oct
|
|
Elsewhere: Oct 12'''
|
|
if country == 'usa':
|
|
return nth_day_of_month(2, MON, OCT, year)
|
|
else:
|
|
return (year, OCT, 12)
|
|
|
|
|
|
def halloween(year):
|
|
'''Oct 31'''
|
|
return (year, OCT, 31)
|
|
|
|
|
|
def election_day(year):
|
|
'''1st Tues in Nov'''
|
|
return nth_day_of_month(1, TUE, NOV, year)
|
|
|
|
|
|
def veterans_day(year):
|
|
'''Nov 11'''
|
|
return (year, NOV, 11)
|
|
|
|
|
|
def rememberance_day(year):
|
|
return veterans_day(year)
|
|
|
|
|
|
def armistice_day(year):
|
|
return veterans_day(year)
|
|
|
|
|
|
def thanksgiving(year, country='usa'):
|
|
'''USA: last Thurs. of November, Canada: 2nd Mon. of October'''
|
|
if country == 'usa':
|
|
if year in [1940, 1941]:
|
|
return nth_day_of_month(3, THU, NOV, year)
|
|
elif year == 1939:
|
|
return nth_day_of_month(4, THU, NOV, year)
|
|
else:
|
|
return nth_day_of_month(0, THU, NOV, year)
|
|
|
|
if country == 'canada':
|
|
return nth_day_of_month(2, MON, OCT, year)
|
|
|
|
|
|
def christmas_eve(year):
|
|
'''24th of December'''
|
|
return (year, DEC, 24)
|
|
|
|
|
|
def christmas(year):
|
|
'''25th of December'''
|
|
return (year, DEC, 25)
|
|
|
|
|
|
def new_years_eve(year):
|
|
'''Dec 31st'''
|
|
return (year, DEC, 31)
|
|
|
|
# Jewish holidays begins the sunset before the first (secular) day of the holiday
|
|
# With the eve option set, the day of this sunset is returned
|
|
# without the option, the (secular) day is returned
|
|
|
|
|
|
def hanukkah(year, eve=None):
|
|
year, month, day = hebrew.to_jd_gregorianyear(year, hebrew.KISLEV, 25)
|
|
if eve:
|
|
day = day - 1
|
|
return year, month, day
|
|
|
|
|
|
def purim(year, eve=None):
|
|
if not hebrew.leap(year + hebrew.HEBREW_YEAR_OFFSET):
|
|
year, month, day = hebrew.to_jd_gregorianyear(year, hebrew.ADAR, 14)
|
|
else:
|
|
year, month, day = hebrew.to_jd_gregorianyear(year, hebrew.VEADAR, 14)
|
|
if eve:
|
|
day = day - 1
|
|
return year, month, day
|
|
|
|
|
|
def rosh_hashanah(year, eve=None):
|
|
year, month, day = hebrew.to_jd_gregorianyear(year, hebrew.TISHRI, 1)
|
|
if eve:
|
|
day = day - 1
|
|
return year, month, day
|
|
|
|
|
|
def yom_kippur(year, eve=None):
|
|
year, month, day = hebrew.to_jd_gregorianyear(year, hebrew.TISHRI, 10)
|
|
if eve:
|
|
day = day - 1
|
|
return year, month, day
|
|
|
|
|
|
def passover(year, eve=None):
|
|
year, month, day = hebrew.to_jd_gregorianyear(year, hebrew.NISAN, 15)
|
|
if eve:
|
|
day = day - 1
|
|
return year, month, day
|
|
|
|
|
|
def shavuot(year, eve=None):
|
|
year, month, day = hebrew.to_jd_gregorianyear(year, hebrew.SIVAN, 6)
|
|
if eve:
|
|
day = day - 1
|
|
return year, month, day
|
|
|
|
|
|
def sukkot(year, eve=None):
|
|
year, month, day = hebrew.to_jd_gregorianyear(year, hebrew.TISHRI, 15)
|
|
if eve:
|
|
day = day - 1
|
|
return year, month, day
|
|
|
|
|
|
# Mexican holidays
|
|
|
|
|
|
def dia_constitucion(year, observed=True):
|
|
if observed:
|
|
return nth_day_of_month(1, MON, FEB, year)
|
|
else:
|
|
return (year, FEB, 5)
|
|
|
|
|
|
def natalicio_benito_juarez(year, observed=True):
|
|
if observed:
|
|
return nth_day_of_month(3, MON, MAR, year)
|
|
else:
|
|
return (year, MAR, 21)
|
|
|
|
|
|
def dia_independencia(year):
|
|
return year, SEP, 16
|
|
|
|
|
|
def dia_revolucion(year):
|
|
return nth_day_of_month(3, MON, NOV, year)
|
|
|
|
|
|
class Holidays(object):
|
|
|
|
def __init__(self, year=None):
|
|
self.year = year or time.localtime().tm_year
|
|
|
|
def set_year(self, year):
|
|
self.year = year
|
|
|
|
def __repr__(self):
|
|
return 'Holidays({})'.format(self.year)
|
|
|
|
# the holidays...
|
|
@property
|
|
def christmas(self):
|
|
return christmas(self.year)
|
|
|
|
@property
|
|
def christmas_eve(self):
|
|
return christmas_eve(self.year)
|
|
|
|
@property
|
|
def thanksgiving(self, country='usa'):
|
|
return thanksgiving(self.year, country)
|
|
|
|
@property
|
|
def new_years(self):
|
|
return new_years(self.year)
|
|
|
|
@property
|
|
def new_years_eve(self):
|
|
return new_years_eve(self.year)
|
|
|
|
@property
|
|
def independence_day(self):
|
|
return independence_day(self.year, observed=True)
|
|
|
|
@property
|
|
def flag_day(self):
|
|
return flag_day(self.year)
|
|
|
|
@property
|
|
def election_day(self):
|
|
return election_day(self.year)
|
|
|
|
@property
|
|
def presidents_day(self):
|
|
return presidents_day(self.year)
|
|
|
|
@property
|
|
def washingtons_birthday(self):
|
|
return washingtons_birthday(self.year)
|
|
|
|
@property
|
|
def lincolns_birthday(self):
|
|
return lincolns_birthday(self.year)
|
|
|
|
@property
|
|
def memorial_day(self):
|
|
return memorial_day(self.year)
|
|
|
|
@property
|
|
def labor_day(self):
|
|
return labor_day(self.year)
|
|
|
|
@property
|
|
def columbus_day(self, country='usa'):
|
|
return columbus_day(self.year, country)
|
|
|
|
@property
|
|
def veterans_day(self):
|
|
return veterans_day(self.year)
|
|
|
|
@property
|
|
def valentines_day(self):
|
|
return valentines_day(self.year)
|
|
|
|
@property
|
|
def halloween(self):
|
|
return halloween(self.year)
|
|
|
|
@property
|
|
def mothers_day(self):
|
|
return mothers_day(self.year)
|
|
|
|
@property
|
|
def fathers_day(self):
|
|
return fathers_day(self.year)
|
|
|
|
@property
|
|
def pulaski_day(self):
|
|
return pulaski_day(self.year)
|
|
|
|
@property
|
|
def easter(self):
|
|
return easter(self.year)
|
|
|
|
@property
|
|
def martin_luther_king_day(self):
|
|
return martin_luther_king_day(self.year)
|
|
|
|
@property
|
|
def hanukkah(self):
|
|
return hanukkah(self.year, eve=False)
|
|
|
|
@property
|
|
def purim(self):
|
|
return purim(self.year, eve=False)
|
|
|
|
@property
|
|
def rosh_hashanah(self):
|
|
return rosh_hashanah(self.year, eve=False)
|
|
|
|
@property
|
|
def yom_kippur(self):
|
|
return yom_kippur(self.year, eve=False)
|
|
|
|
@property
|
|
def passover(self):
|
|
return passover(self.year, eve=False)
|
|
|
|
@property
|
|
def shavuot(self):
|
|
return shavuot(self.year, eve=False)
|
|
|
|
@property
|
|
def sukkot(self):
|
|
return sukkot(self.year, eve=False)
|
|
|
|
@property
|
|
def dia_constitucion(self):
|
|
return dia_constitucion(self.year, observed=True)
|
|
|
|
@property
|
|
def natalicio_benito_juarez(self):
|
|
return natalicio_benito_juarez(self.year, observed=True)
|
|
|
|
@property
|
|
def dia_independencia(self):
|
|
return dia_independencia(self.year)
|
|
|
|
@property
|
|
def dia_revolucion(self):
|
|
return dia_revolucion(self.year)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
holiday = Holidays(time.localtime().tm_year)
|