import sys
import datetime
import ephem
def getNextSunday(date, delta=1):
for i in range(delta):
date += datetime.timedelta(days=1)
while date.strftime("%a") != "Sun":
date += datetime.timedelta(days=1)
return date
def getPrevSunday(date, delta=1):
for i in range(delta):
date += datetime.timedelta(days=-1)
while date.strftime("%a") != "Sun":
date += datetime.timedelta(days=-1)
return date
def getEaster(yr):
g = yr % 19 + 1
s = (yr - 1600) // 100 - (yr - 1600) // 400
l = ((yr // 100 - 14) * 8) // 25
p = (3 - 11 * g + s - l) % 30
if p == 29 or (p == 28 and g > 11):
p -= 1
d = (yr + (yr // 4) - (yr // 100) + (yr // 400)) % 7
x = (4 - d - p) % 7 + 1
e = p + x
easter = datetime.datetime(yr, 3, 21)
easter += datetime.timedelta(days=e)
return easter
def getAdventStart(yr):
christmas = datetime.datetime(yr, 12, 25)
return getPrevSunday(christmas, 4)
def getEpiphany(yr):
jan1 = datetime.datetime(yr, 1, 1)
return getNextSunday(jan1)
def getHolyFamily(yr):
epiphany = getEpiphany(yr + 1)
if datetime.date(yr, 12, 25).weekday() == 6:
return datetime.datetime(yr, 12, 30)
else:
return getPrevSunday(epiphany)
def getAshWednesday(yr):
ashWednesday = getEaster(yr)
ashWednesday += datetime.timedelta(days=-46)
return ashWednesday
def getChristmasEnd(epiphany):
if epiphany.day in [6, 7]:
return epiphany + datetime.timedelta(days=1)
else:
return getNextSunday(epiphany)
def getWeeksBeforeLent(ashWednesday, christmasEnd):
weeks = 0
sundayIndex = ashWednesday
while sundayIndex > christmasEnd:
sundayIndex = getPrevSunday(sundayIndex)
weeks += 1
return weeks
def getPentecostStartOT(pentecost, adventStart, weeksBeforeLent):
weeks = 0
sundayIndex = adventStart
while sundayIndex > pentecost:
sundayIndex = getPrevSunday(sundayIndex)
weeks += 1
if weeks + weeksBeforeLent != 34:
pentecostStart = weeksBeforeLent + 2
else:
pentecostStart = weeksBeforeLent + 1
return pentecostStart
class CalendarData:
def __init__(
self,
weekdayCycle,
sundayCycle,
holyFamily,
epiphany,
christmasEnd,
ashWednesday,
easter,
pentecost,
adventStart,
weeksBeforeLent,
pentecostStartOT,
):
self.weekdayCycle = weekdayCycle
self.sundayCycle = sundayCycle
self.holyFamily = holyFamily
self.epiphany = epiphany
self.christmasEnd = christmasEnd
self.ashWednesday = ashWednesday
self.easter = easter
self.pentecost = pentecost
self.adventStart = adventStart
self.weeksBeforeLent = weeksBeforeLent
self.pentecostStartOT = pentecostStartOT
def getCalendar(year):
weekdayCycle = 2 if year % 2 == 0 else 1
sundayCycle = (year - 1) % 3 + 1 easterDate = getEaster(year)
epiphany = getEpiphany(year)
holyFamily = getHolyFamily(year)
ashWednesday = getAshWednesday(year)
pentecost = easterDate + datetime.timedelta(days=49)
christmasEnd = getChristmasEnd(epiphany)
adventStart = getAdventStart(year)
weeksBeforeLent = getWeeksBeforeLent(ashWednesday, christmasEnd)
pentecostStartOT = getPentecostStartOT(pentecost, adventStart, weeksBeforeLent)
print("Weekday cycle:", weekdayCycle)
print("Sunday cycle:", sundayCycle)
print("Feast of the Holy Family:", holyFamily.strftime("%x"))
print("Feast of Epiphany:", epiphany.strftime("%x"))
print("End of Christmas (Baptism of our Lord):", christmasEnd.strftime("%x"))
print("Ash Wednesday:", ashWednesday.strftime("%x"))
print("Easter:", easterDate.strftime("%x"))
print("Pentecost:", pentecost.strftime("%x"))
print("Advent start:", adventStart.strftime("%x"))
print("Weeks of OT before lent:", weeksBeforeLent)
print("Starting OT after pentecost:", pentecostStartOT)
return CalendarData(
weekdayCycle,
sundayCycle,
holyFamily,
epiphany,
christmasEnd,
ashWednesday,
easterDate,
pentecost,
adventStart,
weeksBeforeLent,
pentecostStartOT,
)
if __name__ == "__main__":
if len(sys.argv) != 2:
print(f"Usage: {sys.argv[0]} year")
sys.exit()
year = int(sys.argv[1])
getCalendar(year)