Python:计算两个日期之间的天数

来源:互联网 发布:微信淘宝客带图转换 编辑:程序博客网 时间:2024/06/08 13:01

Python:计算两个日期之间的天数

这次用python编写了计算两个日期之间的天数的代码,编写的思路是在编写中逐步产生的,过程比较流畅。有几点分析的细节需要点出来:

分析

  • 1. 是否为闰年,2月的天数
    • 能被4整除但不能被100整除,或能被400整除的年份即为闰年
  • 2. 两个日期是同一个月怎么处理
    • 后者减去前者即可
  • 3. 两个日期同年,且所在月份相邻怎么处理
  • 4. 两个日期同年,但所在月份不相邻怎么处理
    • 上面这两个问题的提出是为了引出一种计算思路,即可以将第一个日期所在月份剩余的天数和第二个日期所在月份已经过的天数先加起来,有点“掐头去尾”的意思,于是,如果两个月份相邻,则已经得到结果;若两个月份不相邻,则将中间月份的天数依次加起来即可
  • 5. 两个日期所在年份相邻怎么处理
  • 6. 两个日期所在年份不相邻怎么处理
    • 这两个问题与上面处理3,4问题的思路一样——先“掐头去尾”,计算第一个日期所在年份剩余的天数和第二个日期所在年份已经经过的天数,在看是否需要计算中间年份的天数

代码块

#判断是否为闰年def isLeapYear(year):    if (year%4 ==0 and year%100 !=0 ) or (year%400 == 0):        return True    else:        return Falsedef daysBetweenDates(year1, month1, day1, year2, month2, day2):    #根据year1是否为闰年,选择year1当年每月的天数列表    if isLeapYear(year1):        daysOfMonths1 = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]    else:        daysOfMonths1 = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]    year_temp = year2 - year1     month_temp = month2 - month1    if year_temp == 0:            #同年        if month_temp == 0:       #同年且同月            days = day2 -day1        else:                     #同年但不同月            days = daysOfMonths1[month1-1]-day1+day2  #“掐头去尾”            i = 1 #计算中间月份,若月份相邻则month_temp==1,该循环不会被执行            while i< month_temp:                days += daysOfMonths1[month1+i-1]                                i += 1    else:    #不同年             #根据是否为闰年,得到year2每月天数列表        if isLeapYear(year2):                daysOfMonths2 = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]        else:            daysOfMonths2 = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]        #第一个日期所在年份剩余天数,首先计算第一个月份剩余天数        days = daysOfMonths1[month1-1]-day1        i = 1        while (month1+i<=12):        #若该月不是12月,即 有剩余月份,则执行该循环,累加本年所剩余天数                days += daysOfMonths1[month1+i-1]                i += 1        #计算第二个日期所在年份已经经过的天数        days += day2#先计算当月已经经过的天数        if month2 > 1:#若不是1月,则计算已经经过的月份的天数            j = 1            while j < month2:                days += daysOfMonths2[j-1]                j += 1        #计算中间年份的天数,此时temp_year > 1(即不相邻年份,        #因为以上的“掐头去尾”已经可以得出年份相邻这种情况的结果了)        k = 1        while k < year_temp:            if isLeapYear(year1 + k):                days += 366            else:                days += 365            k += 1    return(days)   

测试与遇到的一点问题

2012,1,1~~2012,2,28 有58天
2011,6,30 ~~2017,6,30 有2192天

可以从Excel上得出两个日期之间的天数,来进行更多的测试。

但是不知从哪里开始,有一天的误差:
1900,1,1~~1999,12,31 代码计算出有36523天,而Excel上有36524天。

有了解的小伙伴,还望不吝赐教哈~~~