1 日期的计算是基于已知条件的,即1800年1月1日是星期三。
2 判断闰年,平年的方法:顺口溜是四年一闰,百年不闰,四百年再闰。
3 至于如何能快速查出亿万年后的日历,如果单单用累加法找,可能真的要打到地老天荒了。在本文中,笔者认为其实在2中,就已经暗示,日历的计算方法,其实是有周期性质的,也就是说其周期为400,那么这样的话,我们其实只须看出400年的具体日历,那么就可以推出亿万年后或者亿万年前的日历。
好了,说了这么多,下面看代码吧,权当python学习过程的一些思考吧!
import time
def print_month(year, month):
print()
print_month_title(year, month)
print_month_body(year%400 + 2000, month)
print('\n')
def print_month_title(year, month):
print(' ', get_month_name(month), ' ', year)
print('---------------------------------------')
print(' 日 一 二 三 四 五 六')
def print_month_body(year, month):
start_day = get_start_day(year, month)
number_of_days_in_month = get_number_of_days_in_month(year, month)
# print('\033[35;1m %s \033[m' % (30))
today = list(time.localtime(time.time()))
i = 0
for i in range(start_day):
print(' ', end = '')
for j in range(1, number_of_days_in_month+1):
#这个地方的作用就是如果你查看的是当年的日历,那么这个判断语句就会
#把当天的日历用紫红色标出
if today[0] == year and today[1] == month and today[2] == j:
print('\033[35;1m %s \033[m' % (j), end = "")
else:
print(format(j, '4d'), end = ' ')
if(j + start_day) % 7 ==0:
print()
def get_month_name(month):
n_month = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
month_name = n_month[month-1]
return month_name
def get_start_day(year, month):
START_DAY_FOR_JAN_1_1800 = 3
total_number_of_days = get_total_number_of_days(year, month)
return((total_number_of_days + START_DAY_FOR_JAN_1_1800) % 7)
def get_number_of_days_in_month(year, month):
if month in [1,3,5,7,8,10,12]:
return 31
elif month in [4,6,9,11]:
return 30
elif is_leapyear(year):
return 29
else:
return 28
def get_total_number_of_days(year, month):
total = 0
for i in range(1800, year):
if is_leapyear(i):
total += 366
else:
total += 365
for j in range(1, month):
total += get_number_of_days_in_month(year, j)
return total
def is_leapyear(year):
if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
return True
else:
return False
def main():
year = eval(input('Which year would you want to see? Enter full year (e.g., 2001): '))
for month_n in range(1,12+1):
# year = year%400 + 2000
print_month(year, month_n)
if __name__ == '__main__':
main()
下面验证一下程序的正确性,先看看2018年的吧,那么运行程序,输入2018,得到部分结果如下左,右为真实的日历:
5.1号为周二,其31天,吻合,
下面找了2800年2月份的日历
下面用程序运行,计算出2800年2月份的日历,以作对比
通过对比可以看出,我们的程序得出的结果与真正的日历是吻合的,验证了程序的正确性。