首先要明白一个公式:d = 天, m = 月份, y = 年
w = (d + 2 * m + 3*(m + 1)//5 + y + y // 4-y//100 + y//400) % 7+1
这个公式是基姆拉尔森公式,计算的结果是对7求余再加1,从而可以推算出星期几,但当月份为一月份或者二月份是,这个时候需要将年份减一,月份为等于一时,月份变为13,月份为二时,月份为14。得出的结果可以推出:
w = 1:星期一
w = 2:星期二
w = 3:星期三
w = 4:星期四
w = 5:星期五
w = 6:星期六
w = 7:星期日
制作日历,还要想到如何判断某一年是瑞年还是平年,那么就可以用到下面这个函数进行判断
def is_leap_year(y):
if y % 400 == 0 or (y % 4 == 0 and y % 100 != 0):
return True
return False
最后就是进行判断一个月有多少天,函数如下:
def get_days_in_month(y, m):
if m in [1, 3, 5, 7, 8, 10, 12]:
return 31
elif m in [4, 6, 9, 11]:
return 30
else:
return 29 if is_leap_year(y) else 28
运行结果为:
最后完整的代码如下:
def get_week_with_date(y, m, d):
y = y-1 if m == 1 or m == 2 else y
m = 13 if m == 1 else (14 if m == 2 else m)
w = (d + 2 * m + 3*(m + 1)//5 + y + y // 4-y//100 + y//400) % 7+1
return w
def is_leap_year(y):
if y % 400 == 0 or (y % 4 == 0 and y % 100 != 0):
return True
return False
def get_days_in_month(y, m):
if m in [1, 3, 5, 7, 8, 10, 12]:
return 31
elif m in [4, 6, 9, 11]:
return 30
else:
return 29 if is_leap_year(y) else 28
while True:
year = int(input('请输入年份:'))
month = int(input('请输入月份:'))
if month > 12:
print('月份输入不正确,请重新输入')
month = int(input('请输入月份:'))
print('一 二 三 四 五 六 日')
print('-'*20)
days = get_days_in_month(year, month)
for i in range(1, days+1):
w = get_week_with_date(year, month, i)
if i == 1:
print(f"{' ' * (w-1) *3}", end='')
if w == 1:
print("")
print(f'{i:2d}', end=' ')
print("")