Вычислить количество дней между двух дат. Где в коде трабл?
Формат ввода: "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 шт):
очень тяжело читается код, давайте его чуть-чуть подожмем
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, а не в конец
А зачем такие сложности? Так не проще?
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