计算单个案例失败的两个日期之间的天数(python,Udacity)

时间:2017-06-08 04:04:27

标签: python calendar

使用计算器计算用户指定的两个日期之间的天数。在每种情况下,除了一个这个计算器工作,但我不知道为什么这一个案例失败。这是我写的代码。

daysOfMonths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

def month2dayz(month):
    i = 0
    month2day = 0
    while i != month - 1:
        month2day = month2day + daysOfMonths[i]
        i = i + 1
    return month2day

def leapDayz(year1, year2, month):
    leapDays = 0
    while year1 != year2 + 1:
        if year1%4 == 0:
            leapDays = leapDays + 1
        year1 = year1 + 1
    if year2%4 == 0 and month < 3:
        leapDays = leapDays - 1
    return leapDays

def daysBetweenDates(year1, month1, day1, year2, month2, day2):
    yearTday = (year2 - year1)*365

    monthTday = month2dayz(month2) - month2dayz(month1)
    leapDays = leapDayz(year1, year2, month2)

    return yearTday + monthTday + (day2 - day1) + leapDays

def test():
    test_cases = [((2012,1,1,2012,2,28), 58), 
                  ((2012,1,1,2012,3,1), 60),
                  ((2011,6,30,2012,6,30), 366),
                  ((2011,1,1,2012,8,8), 585),
                  ((1900,1,1,1999,12,31), 36523)]
    for (args, answer) in test_cases:
        result = daysBetweenDates(*args)
        if result != answer:
            print "Test with data:", args, "failed"
        else:
            print "Test case passed!"
test()

失败的情况是最后一个,计算从1900年1月1日到1999年12月31日的天数。正确的天数是36523,程序吐出36524.

2 个答案:

答案 0 :(得分:2)

您似乎需要扩展函数ymax。此功能的当前实现认为29 - 2闰年日被添加到可被4整除的年份。但在公历中,可被100整除但不能被400整除的年份不包含闰日。

所以,试试这个修改:

leapDayz

if (year1%4 == 0 and year1%100 != 0) or year1%400 == 0:
    leapDays = leapDays + 1

答案 1 :(得分:1)

你似乎将1900年视为闰年。但事实并非如此 - 几个世纪只有当它们被400整除时才会被闰年(因此1900不是,但2000年是,但不是2100,2200或2300)。