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 

posted @ 2018-04-06 23:10  JunSheep  阅读(841)  评论(0编辑  收藏  举报