小象学院—Python学习联盟06—判断第几天

案例描述:

 

  • 输入某年某月某日,判断这一天是第几天?
  • 分析:
  1. 每个月份的天数不同
  2. 闰年与平年的二月份天数不同
  3. 闰年判断:       

            (1)四年一闰,百年不闰。    y%4 == 0  &  y%100 != 0

            (2)四百年再闰。    y%400 == 0

 

必备知识点:

 

  • datetime库
  • 元组

            

 

代码:

  • 1.0代码(自己写的):

 

'''
判断第几天(自己编写)

'''

import datetime


def main():
    #创建元组
    day_one_month = (31,28,31,30,31,30,31,31,30,31,30,31)

    date_str = input('请输入日期(yyyy/mm/dd):')      #日期的字符串形式
    date_value = datetime.datetime.strptime(date_str,'%Y/%m/%d')    #解析字符串

    year = date_value.year
    month = date_value.month
    day = date_value.day

    
    day_one_month_new = sum(day_one_month[:month - 1])
    if month > 2:
        # 2月份的特殊情况(有可能是闰年)
        if year % 400 == 0 or year % 4 ==0 & year % 100 != 0:
        #或者 if(year % 400 == 0)or((year % 4 == 0)and(year % 100 != 0))
            more_one_day = 1
        else:
            more_one_day = 0
    else:
        more_one_day = 0
    day_number_of_year = day + day_one_month_new + more_one_day
    print(day_number_of_year)


if __name__ == '__main__':
    main()

 

 

  • 代码1.0,老师编写:
'''
版本1.0
老师编写
'''

import datetime


def main():
    #创建元组
    day_one_month = (31,28,31,30,31,30,31,31,30,31,30,31)

    date_str = input('请输入日期(yyyy/mm/dd):')      #日期的字符串形式
    date_value = datetime.datetime.strptime(date_str,'%Y/%m/%d')    #解析字符串

    year = date_value.year
    month = date_value.month
    day = date_value.day

    days = sum(day_one_month[:month - 1]) + day

    if month > 2:
        # 2月份的特殊情况(有可能是闰年)
        if year % 400 == 0 or year % 4 ==0 & year % 100 != 0:
        #或者 if(year % 400 == 0)or((year % 4 == 0)and(year % 100 != 0))
            days += 1

    print(days)


if __name__ == '__main__':
    main()

 

 

  • 版本2.0:将元组改为数组,且模块化处理
 
import datetime
def is_leap_year(year):
    '''
    判断是否为闰年
    若是返回 True。若否返回False
    '''
    is_leap = False             #避免出现两个return。且省略了一个else语句
    if year % 400 == 0 or year % 4 == 0 & year % 100 != 0:
        # 或者 if(year % 400 == 0)or((year % 4 == 0)and(year % 100 != 0))
         is_leap = True
    return is_leap


def main():
    #创建列表(可更改列表中的元素值)
    day_one_month_list = [31,28,31,30,31,30,31,31,30,31,30,31]

    date_str = input('请输入日期(yyyy/mm/dd):')      #日期的字符串形式
    date_value = datetime.datetime.strptime(date_str,'%Y/%m/%d')    #解析字符串

    year = date_value.year
    month = date_value.month
    day = date_value.day

    if is_leap_year(year) and month > 2:
        day_one_month_list[1] = 29
    days = sum(day_one_month_list[:month - 1]) + day
    print(days)


if __name__ == '__main__':
    main()

 

 

  • 版本3.0:能否按不同天数将月份划分成不同的集合,然后再操作。
'''
版本3.0
自己编写
'''

import datetime

def is_leap_year(year):
    '''
    判断是否为闰年
    若是返回 True。若否返回False
    '''
    is_leap = False             #避免出现两个return。且省略了一个else语句
    if year % 400 == 0 or year % 4 == 0 & year % 100 != 0:
        # 或者 if(year % 400 == 0)or((year % 4 == 0)and(year % 100 != 0))
         is_leap = True
    return is_leap


def main():

    date_str = input('请输入日期(yyyy/mm/dd):')  # 日期的字符串形式
    date_value = datetime.datetime.strptime(date_str, '%Y/%m/%d')  # 解析字符串

    year = date_value.year
    month = date_value.month
    day = date_value.day

    #创建月份集合
    _30_days_month_set = {4,6,9,11}
    _31_days_month_set = {1,3,5,7,8,10,12}

    month_day = 0
    #遍历之前所有月份,将之前月份天数相加
    for i in range(1,month):    #list(range(1,5)) 起始值从1开始,即【1,2,3,4】

        if i in _30_days_month_set:
            month_day += 30
        elif i in _31_days_month_set:
            month_day += 31
        elif i == 2:
            month_day += 28
    if is_leap_year(year) and month > 2 :
        month_day += 1
    days = month_day + day
    print(days)


if __name__ == '__main__':
    main()
  • 4.0版本:将月份及其对应天数通过字典表示:

 

'''
版本4.0
自己编写
'''

import datetime

def is_leap_year(year):
    '''
    判断是否为闰年
    若是返回 True。若否返回False
    '''
    is_leap = False             #避免出现两个return。且省略了一个else语句
    if year % 400 == 0 or year % 4 == 0 & year % 100 != 0:
        # 或者 if(year % 400 == 0)or((year % 4 == 0)and(year % 100 != 0))
         is_leap = True
    return is_leap


def main():
    date_str = input('请输入日期(yyyy/mm/dd):')  # 日期的字符串形式
    date_value = datetime.datetime.strptime(date_str, '%Y/%m/%d')  # 解析字符串

    year = date_value.year
    month = date_value.month
    day = date_value.day

    #创建月份集合
    _30_days_month_set = {4,6,9,11}
    _31_days_month_set = {1,3,5,7,8,10,12}

    #月份-天数 字典
    month_day_dict = dict()
    month_day = 0
    #遍历之前所有月份,将之前月份天数相加。或者可以自己手动添加到字典中。
    for i in range(1,month):    #list(range(1,5)) 起始值从1开始,即【1,2,3,4】
        if i in _30_days_month_set:
            month_day_dict[i] = 30
        elif i in _31_days_month_set:
            month_day_dict[i] = 31
        elif i == 2:
            month_day_dict[i] = 28
        month_day += month_day_dict[i]
    if is_leap_year(year) and month > 2:
        month_day += 1
    days = month_day + day
    print(days)


if __name__ == '__main__':
    main()

 

最后:

 

  • python提供了一个可以直接获取‘第几天’的方法,一行代码就能完成
  • 自己通过查阅官方文档找到实现方法
  • 提示:

        strftime()中提供了许多格式化日期字符串的操作

        https://docs.python.org/3/library/time.html#time.strftime

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值