【Python練習題 004】輸入某年某月某日,判斷這一天是這一年的第幾天?
----------------------------------------------
這題竟然寫了 28 行代碼!而且還不包含輸入數據的驗證(只能假設輸入的日期是嚴格按照格式來的)。但我堅信,一定有更簡潔的方法,比如 Python 對日期的處理。
不過反正還沒學到這些知識,現在只能用傻大粗的辦法解決。等學到高級的辦法再來更新吧~~~
思路:先判斷是否為閏年,這關系到 2 月份的天數。之后再根據月份值把前幾個月的天數累積加起來,最后再加上個“日”,就可以了。
1 dat = input('請輸入某年某月某日,格式為 yyyy-mm-dd :') 2 y = int(dat[0:4]) #獲取年份 3 m = int(dat[5:7]) #獲取月份 4 d = int(dat[8:]) #獲取日 5 6 ly = False 7 8 if y%100 == 0: #若年份能被100整除 9 if y%400 == 0: #且能被400整除 10 ly = True #則是閏年 11 else: 12 ly = False 13 elif y%4 == 0: #其它情況下,若能被4整除 14 ly = True #則為閏年 15 else: 16 ly = False 17 18 if ly == True: #若為閏年,則2月份有29天 19 ms = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 20 else: 21 ms = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 22 23 days = 0 24 for i in range(1, 13): #從1到12逐一判斷,以確定月份 25 if i == m: 26 for j in range(i-1): #確定月份i之后,則將ms列表中的前i-1項相加 27 days += ms[j] 28 print('%s是該年份的第%s天。' % (dat, (days + d))) #最后再加上“日”,即是答案
請大神幫忙簡化下這渣代碼。跪謝!
【2016-10-13 更新】-------------------------------------------------------------
查了下文檔,發現有個 datetime 的庫,似乎可以用來解這題。代碼如下:
import datetime y = int(input('請輸入4位數字的年份:')) #獲取年份 m = int(input('請輸入月份:')) #獲取月份 d = int(input('請輸入是哪一天:')) #獲取“日” targetDay = datetime.date(y, m, d) #將輸入的日期格式化成標准的日期 print(targetDay - datetime.date(targetDay.year-1, 12, 31)) #減去上一年最后一天,可得解
思路也很簡單:獲取目標日期,然后減去上一年度的最后一天,就可以得出該日期是當年的第幾天。輸出結果如下:
請輸入4位數字的年份:2016
請輸入月份:12
請輸入是哪一天:31
366 days, 0:00:00
但就是不知道怎樣把這個結果 “366 days, 0:00:00” 處理一下、讓只剩下 “366” 這個數值…… datetime庫還得多研究研究才行。
【2016-10-13 更新】-------------------------------------------------------------
又好好查了查 官方文檔,發現上述代碼輸出的結果是 datetime.timedelta(),可以用 datetime.timedelta.days 輕松提取天數。更新代碼如下:
import datetime y = int(input('請輸入4位數字的年份:')) #獲取年份 m = int(input('請輸入月份:')) #獲取月份 d = int(input('請輸入是哪一天:')) #獲取“日” targetDay = datetime.date(y, m, d) #將輸入的日期格式化成標准的日期 dayCount = targetDay - datetime.date(targetDay.year - 1, 12, 31) #減去上一年最后一天 print('%s是%s年的第%s天。'% (targetDay, y, dayCount.days))
輸出結果如下:
請輸入4位數字的年份:2016
請輸入月份:5
請輸入是哪一天:1
2016-05-01是2016年的第122天。
當然,正式用的時候,肯定還得驗證輸入字符的合理性,比如月份只能是 range(1,13),再比如如果是閏年且月份為2,則“天”只能是 range(1,29)等等,這里就不多寫了~~~
++++++++++++++++++++++++++++++++++++++++++++++