I have made a Python program to find the day of the week of an inputted date. I did not want to use the time or datetime module, like in this answer, as I found that a bit too easy. (I like to challenge myself)
I want to improve on appropriately putting certain tasks in functions, so my program is easier to read and follow. I would like to know if the logic in my program makes sense, and if there is anything that could have been done easier. If things could have been in a more "Pythonic" way, that would be nice to know too.
Here is the code -
month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
day_names = ["Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday"]
SYEAR = 2016
SMONTH = 1
SDAY = 1
def is_leap_year(year):
if year % 4 == 0:
if year % 100 == 0:
if year % 400 == 0:
return True
else:
return False
else:
return True
return False
def calc_year(year):
days = 0
tyear = SYEAR
while not tyear == year:
if tyear < year:
if is_leap_year(tyear):
days += 366
else:
days += 365
tyear += 1
if tyear > year:
if is_leap_year(tyear - 1):
days -= 366
else:
days -= 365
tyear -= 1
return days
def calc_month(month, year):
days = 0
tmonth = SMONTH
while not tmonth == month:
if tmonth == 2 and is_leap_year(year):
days += 1
days += month_days[tmonth - 1]
tmonth += 1
return days
def calc_day(day):
days = 0
tday = SDAY
while not tday == day:
tday += 1
days += 1
return days
def find_day(date):
total = calc_month(date[0], date[2]) + calc_day(date[1]) + calc_year(date[2])
if total < 0:
return day_names[total % -7]
else:
return day_names[total % 7]
def main():
date = input("Enter a day like so <MM, DD, YYYY>: ").split()
month = int(date[0])
day = int(date[1])
year = int(date[2])
if month > 12 or month <= 0:
print("Invalid month")
elif day > month_days[month - 1] or day <= 0:
if not (day == 29 and month == 2):
print("Invalid day")
else:
print(find_day((month, day, year)))
if __name__ == "__main__":
main()
I purposely start with the date 01 01 2016, because it is a leap year and (so far) has not had an effect on the outcome of the program.