问题:
用函数实现输入某年某月某日,判断这一天是这一年的第几天?闰年情况也考虑进去
如:20160818,是今年第x天。
代码实现:
import copy
from functools import reduce
def rankDay(date_str):
'''
计算日期为当年的第x天
:param date_str: 日期
:return sum_days: x天
'''
# listx = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
list1_p = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] # 平年
list2_r = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] # 闰年
# print(reduce(lambda x, y: x + y, list1))
# print(reduce(lambda x, y: x + y, list2))
if len(date_str) == 8 and date_str.isnumeric():
# 输入验证正确后1
# 获取年月日
year_int = int(date_str[0:4])
month_int = int(date_str[4:6])
day_int = int(date_str[6:8])
# print(year_int)
# print(month_int)
# print(day_int)
if (month_int >= 1 and month_int <= 12) and (day_int >= 1 and day_int <= 31):
# 进一步验证输入数的正确性2
# 计算天数
# 判断润平年。平年有365天,闰年有366天。
days_list = [] # 计算使用的日子列表
month_days = 0 # 计算使用的前面整月的天数和
day_days = 0 # 计算使用的本月的天数和
if year_int % 400 == 0 or (year_int % 4 == 0 and year_int % 100 != 0):
# 闰年。366天
days_list = copy.deepcopy(list2_r) # 深拷贝
else:
# 平年。356天
days_list = copy.deepcopy(list1_p) # 深拷贝
# 计算前面多个整月的天数
if month_int - 1 > 0:
# 前面有多个整月
list_cal = days_list[0:(month_int - 1)]
# print(list_cal)
month_days = reduce(lambda x, y: x + y, list_cal)
else:
month_days = 0
# 计算本月的天数
day_days = day_int
# 计算总天数
sum_days = month_days + day_days
print("%s是%s年的第%s天" % (date_str, year_int, sum_days))
return sum_days
else:
print("请输入正确的格式,如:20160101。月份不大于12,日子不大于31")
else:
print("请输入正确的格式,如:20160101")
if __name__ == '__main__':
while True:
date_str = input("请输入日期(如:20160101):").strip()
sum_days = rankDay(date_str)
print(sum_days)