-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 から始まる算術演算を使用し、その月の最終日を超えた場合にのみ月を変更します。

タプル間の等価性をテストできることに注意してください。各要素に対して完全なテストを行う必要はありません。うるう年の計算も少し調整する必要があります。

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 に答える