Last active
December 23, 2020 04:32
-
-
Save sokhasen/7c4e2a0c27d3eaa90e993501f2b742e8 to your computer and use it in GitHub Desktop.
Calculate Day of Weeks by Given Date
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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