题目
输入两个日期,计算出两个日期之间间隔(除去周末)多少天?
思路
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. 函数构造,可以合理构造函数已达到复用的情况,比如,日期比较,方法定义,重载等方式的使用。