python 根據年月日,計算是這一年中的第幾天


利用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM