-3

此编码用于查找日期之间的天数。我的编码不适用于我在代码最后作为注释提到的情况,请指定我的错误(注意:(y1,m1,d1)-> 开始日期和(y2, m2,d2) -> 结束日期)

def days_between_dates(y2,m2,d2,y1,m1,d1):
    days = 0
    tot = 0
    while not(y1==y2 and m1==m2 and d1==d2):
        days = days + 1
        d1 = d1+1
        if((m1 == 4 or m1 == 6 or m1 == 9 or m1 == 11) and d1 == 30):
            d1 = 0
            m1 = m1+1
        if(d1 == 31):
            d1 = 0
            m1 = m1+1
        if (((y1%4)!=0) and m1 == 2 and d1==28):
            d1 = 0
            m1 = m1+1
        else:
            if(m1 == 2 and d1 == 29):
                d1 = 0
                m1 = m1+1
        if(m1>12):
            m1 = 1
            y1 = y1 + 1
        if(y1==y2 and m1==m2 and d1==d2):
            return days
            break
    return days
print days_between_dates(2011,1,1,2010,1,1)
print days_between_dates(2013,1,1,2012,1,1)
#print days_between_dates(2012,2,29,2012,2,28)
4

1 回答 1

9

避免重新发明轮子,datetime而是使用模块:

from datetime import date

def days_between_dates(y2, m2, d2, y1, m1, d1):
    return (date(y2, m2, d2) - date(y1, m1, d1)).days

至于您的错误:您使用的是基于 0 的日期算术;每当你到了月底,你就会切换到下个月的第 0 天。这意味着,例如,如果日期是该月的最后一天,您将永远不会达到结束条件;y2, m2, d1在您测试之前,2012, 2, 29您已经将日期更改为2012, 3, 0.

使用从 1 开始的算术,并且仅在超过该月的最后一天时才更改月份。

Note that you can test equality between tuples, no need to do a full test against each element. Your leap year calculation needs a little refinement too:

def is_leap_year(year):
    if year % 400 == 0:
        return True
    if year % 100 == 0:
        return False
    return year % 4 == 0

def days_between_dates(y2, m2, d2, y1, m1, d1):
    days = 0
    isleapyear = is_leap_year(y1)

    while (y1, m1, d1) != (y2, m2, d2):
        days += 1
        d1 += 1

        if (m1 == 2 and d1 == (30 if isleapyear else 29) or
            m1 in (4, 6, 9, 11) and d1 == 31 or d1 == 32):
            d1 = 1
            m1 += 1

        if m1 == 13:
            m1 = 1
            y1 += 1
            isleapyear = is_leap_year(y1)

    return days
于 2013-08-05T12:14:25.480 回答