""" 题目:输入某年某月某日,判断这一天是这一年的第几天? """ import datetime import time from functools import reduce def calculate1(t): """ 直接利用python的datetime模块计算 :param t: :return: """ print("计算一", end=":") print(t.strftime("%j")) def calculate2(t): """ 自己手动计算一下 :param t: :return: """ print("计算二", end=":") days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] daysLeap = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] year = t.year if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0): print(sum(daysLeap[:t.month - 1]) + t.day) else: print(sum(days[:t.month - 1]) + t.day) def calculate3(t): """ 高手简化后的calculate2 :param t: :return: """ print("计算三", end=":") days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] year = t.year if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0): days[1] = 29 print(sum(days[0: t.month - 1]) + t.day) def calculate4(t): """ 利用字典来计算 :param t: :return: """ print("计算四", end=":") dayDict = {0: 0, 1: 31, 2: 59, 3: 90, 4: 120, 5: 151, 6: 181, 7: 212, 8: 243, 9: 273, 10: 304, 11: 334, 12: 365} year = t.year d = dayDict[t.month - 1] + t.day if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0): d += 1 print(d) def calculate5(t): """ 利用time模块来计算,注意和datetime模块进行区分 :param t: :return: """ print("计算五", end=":") t = time.strptime(t.strftime("%Y-%m-%d"), "%Y-%m-%d") print(t[7]) def calculate6(t): """ 利用datetime的时间相减来计算 :param t: :return: """ print("计算六", end=":") t1 = datetime.date(t.year, 1, 1) t2 = t - t1 print(t2.days + 1) def calculate7(t): """ 利用time的时间相减来计算,注意与datetime进行区分,它不能直接减,需要转成时间戳才能减 以为时间戳是以1970年为基点计算的,所以该方法只能计算1970以后(不包括1970)的时间 :param t: :return: """ print("计算七", end=":") t1 = time.strptime(t.strftime("%Y-01-01"), "%Y-%m-%d") t1 = time.mktime(t1) t = time.strptime(t.strftime("%Y-%m-%d"), "%Y-%m-%d") t = time.mktime(t) t2 = t - t1 t2 = t2 // (3600 * 24) print(int(t2) + 1) def calculate8(t): """ 利用reduce函数来计算,中间有用到三元运算符 在Python 3里,reduce()函数已经被从全局名字空间里移除了,它现在被放置在fucntools模块里 用的话要 先引入 from functools import reduce :param t: :return: """ print("计算八", end=":") year = t.year days = [0, 31, 28 if year % 4 else 29 if year % 100 else 28 if year % 400 else 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] print(reduce(lambda a, b: a + b, days[0: t.month]) + t.day) def calculate9(t): """ 利用位运算来计算闰年: 分析 year&3 等价于 year%4:因为二进制转十进制是:2**0+2**1+2**2+。。。,可见2**2之后的都可以被4整除 同理 year&15 等价 year%16 根据闰年计算规则我们可以知道:不能被4整除的年份肯定不是闰年,而能被4整除又能被25整数但不能再被16整数的也不是闰年,其余全是闰年 可得 year%4 or year%16 and !year%25 这些都不是闰年,反之!(year%4 or year%16 and !year%25)为闰年 转为位运算!(year&3 or year&15 and !(year%25)) :param t: :return: """ print("计算九", end=":") days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] year = t.year if not(year & 3 or year & 15 and not(year % 25)): days[1] = 29 print(sum(days[0: t.month - 1]) + t.day) def answer(): """ 通过try来判断输入的日期是否正确 :return: """ year = input("输入年:") if year == "q": return month = input("输入月:") day = input("输入日:") try: t = datetime.date(int(year), int(month), int(day)) calculate1(t) calculate2(t) calculate3(t) calculate4(t) calculate5(t) calculate6(t) calculate7(t) calculate8(t) calculate9(t) except ValueError: print("输入的日期错误") print("继续,或输入q推出") answer() answer()