DAY 003--判断某年月日是一年中的哪一天
003-- 判断用户输入的某年月日是该年中的哪一天
闰年:整百的年,能被400整除的为闰年;非整百的年份,能被4整除的为闰年
当前日期为当年第几天 = 当前日期 - 去年最后一天的日期
流程分析--普通青年版:
1、定义months、days列表,分别将非闰年每个月天数、闰年每个月天数按照1-12月的顺序写入表格中
2、让用户输入日期,以-拼接,并判断用户输入是否合法--input、str.split("-")、len()
3、写一个判断年份是否为闰年的函数,将用户输入的year传入函数参数,并判断该年返回是否为闰年
4、写一个统计本月本日是本年的哪一天的函数,主要思想为:
4.1、将用户输入月份值在months列表中找到它的索引值months_index,然后在days将0到(months_index-1)的索引值相加得到days_count
4.2、如果该年为闰年并且月份大于2,days_count+1天
代码--普通青年版:
months=[1,2,3,4,5,6,7,8,9,10,11,12]#月份列表 days=[31,28,31,30,31,30,31,31,30,31,30,31]#非闰年每月天数的列表 def check_year(year):#判断月份是否为闰年 if year%100 == 0 and year%400==0:#整百年:能被100整除,也能被400整除的是闰年 Leap_Year = True return Leap_Year elif year%100 !=0 and year%4==0:#非整百年,能被4整除的是闰年 Leap_Year = True return Leap_Year else:#非闰年 Leap_Year=False return Leap_Year def Days_Count(year_flag,year,month,day):#计算天数 date = "-".join(map(str,[year,month,day]))#新知识点:用内置函数map函数,将列表中的数字转换为字符串 days_count = 0 for i in range(0, months.index(month)):#得到月的索引值,然后将前一月份的所有天数相加 days_count += days[i]#计算截止本月前一个月经历了多少天 days_count+=day if year_flag==True and month>2: days_count+=1 print("{} 是 {} 中的第 \033[32;1m{} \33[0m天".format(date, str(year),str(days_count))) def main():#主程序 input_date=input("请输入年月日:").strip()#输入年月日,年月日用“-”拼接 if len(input_date.split("-"))==3: year, month, day = input_date.split("-") year = int(year.strip()) month =int(month.strip()) day = int(day.strip()) year_flag=check_year(year) Days_Count(year_flag,year,month,day) else: print("\33[31;1m格式错误\33[0m:\n请按照“yyyy-mm-dd”格式输入!") if __name__=="__main__":#运行主程序 main()
流程分析--文艺青年版
1、让用户分别输入年、月、日
2、引入datetime模块,将输入的年月日,用datetime.date转换为日期
3、该日期为该年的第几天 = 今天的日期 - 去年的最后一天的日期
代码--文艺青年版:
import datetime year = int(input('请输入4位数字的年份:')) # 获取年份 mon = int(input('请输入月份:')) # 获取月份 day = int(input('请输入是哪一天:')) # 获取“日” targetDay = datetime.date(year, mon, day) # 将输入的日期格式化成标准的日期 Time_difference=targetDay - datetime.date(targetDay.year - 1, 12, 31)#将输入的日期减去前一年的最后一天,得到这是今年的第一天的时间 print("{} 是 {} 年中的第 {} 天".format(targetDay,year,Time_difference.days)) # 减去上一年最后一天,可得解
流程分析--优秀青年版:
1、利用time模块,将输入的年月日数字格式化
2、利用datetime模块中的tm_yday获取当前日期为一年中的哪一天
代码--优秀青年版:
import time,datetime date=input("请输入年月日:") try: date_format=time.strptime(date,"%Y%m%d") print("{} 是 {} 年中的第 {} 天".format(date,date_format.tm_year,date_format.tm_yday)) except: print("输入值无法查询!")
题目反思 :
1、虽然题目很简单,但是第一题的方法和第三题比起来就是快、准、狠,第二题的解决方法可以增加解题的思路,这让我体会到模块也许会简化很多普通的步骤,也说明自己的模块方法掌握的很糟糕
2、BUG总结--解题方法一:
list=[year, month, day]
print("-".join(list))
ERROR:
sequence item 0: expected str instance, int found
BUG原因:
str.join(sequence)
- 将列表中的元素拼接起来,需要注意的是:str.join(sequence) 函数中的 sequence 中的元素必须为字符串,否则会报错
解决BUG:
map(function, iterable, ...)
- 将列表中的元素转换为字符串的方法:map(str,list)
3、BUG总结--解题方法二
targetDay = datetime.date(year, mon, day) # Time_difference=targetDay - datetime.date(targetDay.year - 1, 12, 31) print(Time_difference) 30 days, 0:00:00
BUG原因:
datetime.date(year, month, day)
原因:两个时间相减,得到的是resolution=1 day, 0:00:00的格式,不能直接取到相隔天数的整数
- 3个属性都只是可读的。
- 3个属性的值的范围:
- MINYEAR <= year <= MAXYEAR1 <= month <= 12
- 1 <= day <= number of days in the given month and year
- 有三个静态属性:min=0001-01-01、max=9999-12-31、resolution=1 day, 0:00:00(最小时间差值)
解决BUG:
直接获取时间差的days属性,即 Time_difference.days
print(Time_difference.days) 30
4、第二种方法还可以判断用户输入是否正确,输入月份、天数的判断;比较推荐第二种解答方法,第一种就忘掉吧,哈哈哈😆
新学知识点:
1、map(str,list):将list中的元素变为字符串
2、datetime.date(year,month,day):格式化年月日
3、日期为该年中哪一天=datetime.date(year,month,day)-datetime.date(year-1,month,year)
Mark on 2018.4.6