python 实现日期计算器

题目

输入两个日期,计算出两个日期之间间隔(除去周末)多少天?

思路

1. 比较输入的日期,那个在前面,哪个在后面。

2. 计算从前日期到后日期的天数

3. 考虑周末的情况

代码

代码为初学者手撕,难免会有错误,欢迎批评指正。

import re

MonthDay=(31,28,31,30,31,30,31,31,30,31,30,31)
Weeks={'Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'}

MondayDay='1900-01-01'
FirstYear=0

def caculate(day1, day1_week_index, day2, weakends_enable):
    sp=re.compile('-')
    day1_list=sp.split(day1)
    day2_list=sp.split(day2)

    day1_list=list(map(lambda x:int(x),day1_list))
    day2_list=list(map(lambda x:int(x),day2_list))
    
    #判断输入的合理性
    if (day1_list[0]<=FirstYear or day1_list[0]>9999) or(day2_list[0]<=FirstYear or day2_list[0]>9999):
        print 'years erro'
        return -1

    if (day1_list[1]<=0 or day1_list[1]>12) or(day2_list[1]<=0 or day2_list[1]>12):
        print 'month erro'
        return -1
    if day1_list[1] in (1,3,5,7,8,10,12):
        if (day1_list[2]<=0 or day1_list[2]>31):
            print 'day_31 erro'
            return -1
    else:
        if day1_list[1]==2 and day1_list[2]>28:
            print 'day_28 erro'
            return -1
        else:
            if day1_list[2]>30:
                print 'day_30 erro'
                return -1

    if day2_list[1] in (1,3,5,7,8,10,12):
        if (day2_list[2]<=0 or day2_list[2]>31):
            print 'day_31 erro'
            return -1
    else:
        if day2_list[1]==2 and day2_list[2]>28:
            print 'day_28 erro'
            return -1
        else:
            if day2_list[2]>30:
                print 'day_30 erro'
                return -1
    #判断日期前后关系
    orient = 0
    if ( (day2_list[0]<day1_list[0]) or
    (day2_list[0]==day1_list[0] and day2_list[1]<day1_list[1]) or
    (day2_list[0]==day1_list[0] and day2_list[1]<day1_list[1] and day2_list[2]<day1_list[2] )):
        day1_list,day2_list=day2_list,day1_list
        orient=1

    year = day1_list[0]
    month= day1_list[1]
    day  = day1_list[2]
    res  =0
    weekcount=day1_week_index
    #计算日期,从前日期计数到后面的日期
    while year<day2_list[0] or  month<day2_list[1] or day<day2_list[2]:
        day+=1
        #如果使能周末剔除计数
        if weakends_enable:
            if orient==0:
                weekcount+=1
            else:
                weekcount-=1
            #剔除周末
            if weekcount!=5 and weekcount!=6:
                res+=1
            if weekcount >6:
                weekcount=0
            if weekcount <0:
                weekcount=6
        else:
            res+=1
        if day>MonthDay[month-1]:
            day=1
            month+=1
        if month>12:
            month=1
            year+=1
    return res

if __name__=='__main__':
    print 'Usage: .py YYYY-MM-DD YYYY-MM-DD'
    first=raw_input('date1:')
    second=raw_input('date2:')
    weekends_exclude =1
    week_cacualte_day = caculate(MondayDay,0,first,0)
    week_index=(week_cacualte_day%7)
    print '==================================='
    print 'There are [ %d ]days %s \n between %s and %s' % (caculate(first,week_index, second,weekends_exclude),
            ('weekends ex' if (weekends_exclude) else ' '),first,second)

改进

1. 输入与算法分离,输入错误应该有异常抛出

2. 返回值情况函数在运算过程中返回的信息在不增加复杂度的情况应该进可能的多

比如,可以根据思路写一个函数,返回的值包括含有周末,不含有周末,以及日期大小的情况

3. 函数构造,可以合理构造函数已达到复用的情况,比如,日期比较,方法定义,重载等方式的使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值