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