利用python计算某一天是这一年中的第几天,例如,给定年份= 2019年,月份= 1,日期= 3,则返回3;因为2019-01-03日期是2019年的第3 天。
首先,我们要知道闰年、平年怎么区分:
非整百年:能被4整除的为闰年。(如2004年就是闰年,2001年不是闰年);
整百年:能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)。
对于公元前和数值很大的年份,我们这里不做讨论。下面我们来写一下代码:
我按照功能把代码分成了几部分,首先定义几个会用到的常量:
1 month_of_days31 = [1, 3, 5, 7, 8, 10, 12]2 month_of_days30 = [4, 6, 9, 11]3 feb_month = 2
我们需要判断一下当前年份是不是闰年:
1 def is_leap_year(year):2 """3 判断当前年份是不是闰年,年份公元后,且不是过大年份4 :param year: 年份5 :return: True 闰年, False 平年6 """7 if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:8 return True9 return False
然后,对年、月、日参数做一下参数校验
1 def validate_param(year, month, day): 2 """ 3 参数校验 4 :param year: 年份 5 :param month: 月份 6 :param day: 日期 7 :return: error_msg 错误信息,没有为空 8 """ 9 error_msg = u''10 if not isinstance(year, int) or year < 1:11 error_msg = u'年份输入不符合要求'12 if not isinstance(month, int) or month < 1 or month > 12:13 error_msg = u'月份输入不符合要求'14 if not isinstance(day, int) or day < 1 \15 or (month in month_of_days31 and day > 31) \16 or (month in month_of_days30 and day > 30) \17 or (month == feb_month and (day > 29 if is_leap_year(year) else day > 28)):18 error_msg = u'日期输入不符合要求'19 return error_msg
最后,对年、月、日进行计算:
1 def get_day_of_year(year, month, day): 2 """ 3 获取一个日期在这一年中的第几天 4 :param year: 年份 5 :param month: 月份 6 :param day: 日期 7 :return: 在这一年中的第几天 8 """ 9 # 参数校验10 error_msg = validate_param(year, month, day)11 if error_msg:12 return error_msg13 14 if month == 1:15 return day16 17 if month == 2:18 return day + 3119 20 days_of_31_num = 021 days_of_30_num = 022 # 31天月份数23 for days_of_31 in month_of_days31:24 if days_of_31 < month:25 days_of_31_num += 126 else:27 break28 29 # 30天月份数30 for days_of_30 in month_of_days30:31 if days_of_30 < month:32 days_of_30_num += 133 else:34 break35 36 return days_of_31_num * 31 + days_of_30_num * 30 + (29 if is_leap_year(year) else 28) + day