2013-08-05 2 views
-3

Это кодирование, чтобы найти дни между датами. Кодирование не работает для случая, который я упомянул в качестве комментария в конце кода, pls указывают мою ошибку (примечание: (y1, m1, d1) -> дата начала и (y2, m2, d2) -> дата окончания)Расчет дней между двумя заданными датами

def days_between_dates(y2,m2,d2,y1,m1,d1): 
    days = 0 
    tot = 0 
    while not(y1==y2 and m1==m2 and d1==d2): 
     days = days + 1 
     d1 = d1+1 
     if((m1 == 4 or m1 == 6 or m1 == 9 or m1 == 11) and d1 == 30): 
      d1 = 0 
      m1 = m1+1 
     if(d1 == 31): 
      d1 = 0 
      m1 = m1+1 
     if (((y1%4)!=0) and m1 == 2 and d1==28): 
      d1 = 0 
      m1 = m1+1 
     else: 
      if(m1 == 2 and d1 == 29): 
       d1 = 0 
       m1 = m1+1 
     if(m1>12): 
      m1 = 1 
      y1 = y1 + 1 
     if(y1==y2 and m1==m2 and d1==d2): 
      return days 
      break 
    return days 
print days_between_dates(2011,1,1,2010,1,1) 
print days_between_dates(2013,1,1,2012,1,1) 
#print days_between_dates(2012,2,29,2012,2,28) 
+0

Дубликат удален из SO. – showdev

ответ

9

Избегайте изобретать велосипед, а использовать datetime модуль вместо:

from datetime import date 

def days_between_dates(y2, m2, d2, y1, m1, d1): 
    return (date(y2, m2, d2) - date(y1, m1, d1)).days 

Что касается вашей ошибки: Вы используете арифметику даты на основе 0; всякий раз, когда вы приходите к концу месяца, вы переключаетесь на день 0 следующего месяца. Это означает, что никогда не будет, если последний день месяца, например, день y2, m2, d1; перед тем, как вы проверите для 2012, 2, 29, вы уже поменяли дату на 2012, 3, 0.

Используйте арифметику на основе 1 и измените только месяц, когда вы получите за пределами в последний день этого месяца.

Обратите внимание, что вы можете проверить равенство между кортежами, не нужно делать полный тест против каждого элемента. Расчет вашего високосного года также нуждается в небольшом уточнении:

def is_leap_year(year): 
    if year % 400 == 0: 
     return True 
    if year % 100 == 0: 
     return False 
    return year % 4 == 0 

def days_between_dates(y2, m2, d2, y1, m1, d1): 
    days = 0 
    isleapyear = is_leap_year(y1) 

    while (y1, m1, d1) != (y2, m2, d2): 
     days += 1 
     d1 += 1 

     if (m1 == 2 and d1 == (30 if isleapyear else 29) or 
      m1 in (4, 6, 9, 11) and d1 == 31 or d1 == 32): 
      d1 = 1 
      m1 += 1 

     if m1 == 13: 
      m1 = 1 
      y1 += 1 
      isleapyear = is_leap_year(y1) 

    return days 
+0

Тысяча раз это. 999, если вы отключены одним. –

+0

Удовлетворяет ли UDacity CS101 грейдер? Это точно тот же самый ответ, который получил вчера, и ему не понравилось. – DSM

+0

Это тест, пожалуйста, помогите мне найти с моим кодом. и указать мне, где я ошибся – user2649815

Смежные вопросы