Skip to content

Instantly share code, notes, and snippets.

@sokhasen
Last active December 23, 2020 04:32
Show Gist options
  • Save sokhasen/7c4e2a0c27d3eaa90e993501f2b742e8 to your computer and use it in GitHub Desktop.
Save sokhasen/7c4e2a0c27d3eaa90e993501f2b742e8 to your computer and use it in GitHub Desktop.
Calculate Day of Weeks by Given Date
import datetime
from collections import namedtuple
import math
import re
Day = namedtuple('Day', 'code title')
MonthCode = namedtuple('MonthCode', 'number code')
CenturyCode = namedtuple('CenturyCode', 'year code')
class GetDay(object):
def __init__(self) -> None:
super().__init__()
self.day_of_week = [
Day(0, 'Sunday'),
Day(1, 'Monday'),
Day(2, 'Tuesday'),
Day(3, 'Wednesday'),
Day(4, 'Thursday'),
Day(5, 'Friday'),
Day(6, 'Saturday')]
self.centuryCodes = [
CenturyCode(1700, 4),
CenturyCode(1800, 2),
CenturyCode(1900, 0),
CenturyCode(2000, 6),
CenturyCode(2100, 4),
CenturyCode(2200, 2),
CenturyCode(2300, 0)]
self.monthCodes = [
MonthCode(1, 0),
MonthCode(2, 3),
MonthCode(3, 3),
MonthCode(4, 6),
MonthCode(5, 1),
MonthCode(6, 4),
MonthCode(7, 6),
MonthCode(8, 2),
MonthCode(9, 5),
MonthCode(10, 0),
MonthCode(11, 3),
MonthCode(12, 5)]
def dayOf(self, date: str):
date = datetime.datetime.strptime(
re.sub(r'\W', '-', date), '%d-%m-%Y')
return self.calculate(date)
def calculate(self, date: datetime.datetime):
year = date.year
month = date.month
day = date.day
yearCode = self.getYearCode(year)
monthCode = self.getMonthCode(month)
centuryCode = self.getCenturyCode(year)
leapYear = self.getLeapYearCode(year)
result = (yearCode + monthCode + centuryCode + day - leapYear) % 7
day_index = math.floor(result)
return self.day_of_week[day_index].title
def getYearCode(self, year: int):
yy = int(str(year)[-2:])
result = (yy + (yy/4)) % 7
return math.floor(result)
def getMonthCode(self, month):
return self.monthCodes[month - 1].code
def getCenturyCode(self, year):
if year >= 1700 and year < 1800:
return self.centuryCodes[0].code
elif year >= 1800 and year < 1900:
return self.centuryCodes[1].code
elif year >= 1900 and year < 2000:
return self.centuryCodes[2].code
elif year >= 2000 and year < 2100:
return self.centuryCodes[3].code
elif year >= 2100 and year < 2200:
return self.centuryCodes[4].code
elif year >= 2200 and year < 2300:
return self.centuryCodes[5].code
elif year >= 2300 and year < 2400:
return self.centuryCodes[6].code
else:
raise ValueError('Year is not eligible!')
def getLeapYearCode(self, year):
return 0 if ((year % 4) > 0 or (year % 100) > 0 or (year % 400) > 0) else 1
if __name__ == "__main__":
getDay = GetDay()
dateDMY = '09-12-2020'
day = getDay.dayOf(dateDMY)
print('-------------------------------')
print(f"🐔. What day of the week is it on {dateDMY}?")
print(f"🐣. It's \"{day}\"!")
print('-------------------------------')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment