利用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 True 9 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_msg 13 14 if month == 1: 15 return day 16 17 if month == 2: 18 return day + 31 19 20 days_of_31_num = 0 21 days_of_30_num = 0 22 # 31天月份數 23 for days_of_31 in month_of_days31: 24 if days_of_31 < month: 25 days_of_31_num += 1 26 else: 27 break 28 29 # 30天月份數 30 for days_of_30 in month_of_days30: 31 if days_of_30 < month: 32 days_of_30_num += 1 33 else: 34 break 35 36 return days_of_31_num * 31 + days_of_30_num * 30 + (29 if is_leap_year(year) else 28) + day