Python daysBetweenDate

Я думаю, что у меня может быть бесконечный цикл, потому что я все время возвращаю сообщение об ошибке всякий раз, когда запускаю код, он говорит, что «программа выключена для использования 13 секунд процессора».

Весь код должен принимать дату ввода и вывода на следующий день, этот код предполагает, что все месяцы составляют 30 дней. Помимо функции daysBetweenDates , все остальное работает нормально. У кого-нибудь есть предложения? Или может кто-то может сказать мне, что мне не хватает?

 def daysInMonth(year, month): return 30 def nextDay(year, month, day): if day < 30: return year, month, day + 1 else: if month == 12: return year + 1, 1, 1 else: return year, month + 1, 1 return def dateIsBefore(year1, month1, day1, year2, month2, day2): if year1 < year2: return True def daysBetweenDates(year1, month1, day1, year2, month2, day2): days = 0 while dateIsBefore(year1, month1, day1, year2, month2, day2): days += 1 return days 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" print result else: print "Test case passed!" test() 

Ваш алгоритм daysBetweenDates() действительно имеет бесконечный цикл.

 while dateIsBefore(year1, month1, day1, year2, month2, day2): days += 1 

Вы никогда не изменяете значения года / месяца / дня здесь, в цикле, поэтому, если условие истинно один раз, оно будет истинным навсегда.

Решение, по идее, заключалось бы в том, чтобы каждый день уменьшать day2 на единицу, поэтому, когда две даты станут равными, days будут разницей в день между ними. Однако, поскольку вы сказали, что сделали предположение, что каждый месяц имеет 30 дней, вы слишком сильно себя чувствуете. Вы можете найти разницу в день между двумя датами, конвертируя кортеж (год, месяц, день) в значение дня. Например,

 def days_between_dates(y1, m1, d1, y2, m2, d2): date1 = y1*360 + (m1-1)*30 + d1 date2 = y2*360 + (m2-1)*30 + d2 # assuming you want to return 0 if date2 is before date1 return date2 - date1 if date2 >= date1 else 0 

Функция dateIsBefore является неполной.

 def dateIsBefore(year1, month1, day1, year2, month2, day2): if year1 < year2: return True if year1 == year2 and month1 < month2: return True if year1 == year2 and month1 == month2 and day1 < day2: return True return False 

(Это может быть упрощено, но я оставил его как это для ясности. Кроме того, конечно, вы могли бы использовать datetime.date кто-то еще уже сделал этот комментарий, см. Также другой ответ, в котором говорится о том, что вам нужно увеличивать год1, месяц1 и день1 )

dateIsBefore всегда будет возвращать True.