Вычислить количество дней между двух дат. Где в коде трабл?

Формат ввода: "Month DD, YYYY" В некоторых случаях вывод правильный, а в некоторых нет. Например: 1) July 14, 1985; December 15, 2008 2) September 14, 1975; October 20, 2008

from re import split

def iyl(y): #Is year leap
    if y % 400 == 0 or y % 4 == 0 and y % 100 != 0: return True
    else: return False
m1,d1,y1 = split(r' |, ', input())
m2,d2,y2 = split(r' |, ', input())
def cm(m):
    if m == 'January': return 0
    elif m == 'February': return 1
    elif m == 'March': return 2
    elif m == 'April': return 3
    elif m == 'May': return 4
    elif m == 'June': return 5
    elif m == 'July': return 6
    elif m == 'August': return 7
    elif m == 'September': return 8
    elif m == 'October': return 9
    elif m == 'November': return 10
    else: return 11

d1,d2 = int(d1), int(d2)
y1,y2 = int(y1), int(y2)
m1 = cm(m1)
m2 = cm(m2)
md = {0:31,1:28,2:31,3:30,4:31,5:30,6:31,7:31,8:30,9:31,10:30,11:31}
total = 0

if iyl(y1) and m1 == 1:
    total+=md[m1]-d1 + 1
else:
    total+=md[m1]-d1
    
m1+=1

while True:
    if iyl(y1): md[1] = 29
    
    if m1==m2 and y1 == y2:
        total += md[m2]-d2
        break
    else:
        total += md[m1]
        m1+=1
        
    md[1] = 28
    
    if m1 == 12:
        m1 = 0
        y1+=1
        
print(total)

Ответы (2 шт):

Автор решения: Zhihar

очень тяжело читается код, давайте его чуть-чуть подожмем

from re import split


def iyl(y):  # Is year leap
    return y % 400 == 0 or y % 4 == 0 and y % 100 != 0


m1, d1, y1 = split(r' |, ', input())
m2, d2, y2 = split(r' |, ', input())


cm = {'January': 0, 'February': 1, 'March': 2, 'April': 3, 'May': 4, 'June': 5, 'July': 6,
      'August': 7, 'September': 8, 'October': 9, 'November': 10, 'December': 11,}

m1, d1, y1 = cm[m1], int(d1), int(y1)
m2, d2, y2 = cm[m2], int(d2), int(y2)

md = {0: 31, 1: 28, 2: 31, 3: 30, 4: 31, 5: 30, 6: 31, 7: 31, 8: 30, 9: 31, 10: 30, 11: 31}

total = md[m1] - d1 + int(iyl(y1) and m1 == 1)

m1 += 1

while True:
    md[1] = 29 if iyl(y1) else 28

    if m1 == m2 and y1 == y2:
        total += md[m2] - d2
        break

    total += md[m1]
    m1 += 1

    if m1 == 12:
        m1 = 0
        y1 += 1

print(total)

вроде как код корректный, но

ошибка 1:

если обе даты приходятся на один и тот же месяц одного и того же кода программа просто уходит в бесконечный цикл, поскольку if m1 == m2 and y1 == y2: никогда не выполнится ибо m1 = m2 + 1 к тому моменту

ошибка 2:

условие выхода из цикла:

if m1 == m2 and y1 == y2:
    total += md[m2] - d2
    break

т.е. к общему счетчику мы прибавляем кол-во дней в месяце минус день второй даты

но секундочку, разве мы не должны прибавить просто кол-во дней второй даты?

ошибка 3:

если у первой даты месяц Декабрь, то происходит следующее:

m1 += 1 # m1 = 12

и перед входом в цикл надо бы опять сделать:

m1 = 0
y1 += 1

но этого не происходит, поэтому возникает проблема с годом - появляется разница в год

я бы советовал проверку

if m1 == 12:
    m1 = 0
    y1 += 1

перенести сразу в начало while, а не в конец

→ Ссылка
Автор решения: Namerek

А зачем такие сложности? Так не проще?

from datetime import datetime

d1 = 'July 14, 1985; December 15, 2008'
d2 = 'September 14, 1975; October 20, 2008'

d_pattern = '%B %d, %Y'

r1 = d1.split("; ")
r2 = d2.split("; ")

dd1 = (datetime.strptime(r1[1], d_pattern) - datetime.strptime(r1[0], d_pattern)).days
dd2 = (datetime.strptime(r2[1], d_pattern) - datetime.strptime(r2[0], d_pattern)).days
if __name__ == '__main__':
    print(dd1, dd2)
# 8555 12090

И даже если предположить, что даты не всегда могут стоять в порядке возрастания, то можно сделать так :

from datetime import datetime

d1 = 'July 14, 1985; December 15, 2008'
d2 = 'September 14, 1975; October 20, 2008'

d_pattern = '%B %d, %Y'

dp1 = [datetime.strptime(elem, d_pattern) for elem in d1.split('; ')]
dp2 = [datetime.strptime(elem, d_pattern) for elem in d2.split('; ')]

dd1 = (max(dp1) - min(dp1)).days
dd2 = (max(dp2) - min(dp2)).days
if __name__ == '__main__':
    print(dd1, dd2)
# 8555 12090
→ Ссылка