2013-08-05 7 views
-3

Ce codage consiste à trouver les jours entre dates.mon codage ne fonctionne pas pour le cas que j'ai mentionné comme commentaire au dernier code, pls précise mon erreur (note: (y1, m1, d1) -> date de début et (y2, m2, d2) -> date de fin)Calcul des jours entre deux dates données

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

Le doublon a été supprimé de SO. – showdev

Répondre

9

éviter de réinventer la roue, et utiliser le module datetime à la place:

from datetime import date 

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

Quant à votre erreur: Vous utilisez une arithmétique de date basée sur 0; chaque fois que vous arrivez à la fin d'un mois, vous passez au jour 0 du mois suivant. Cela signifie que vous jamais atteindre la condition de fin si le jour y2, m2, d1 est le dernier jour du mois, par exemple; Avant de tester pour 2012, 2, 29 vous avez déjà changé la date à 2012, 3, 0.

Utilisez l'arithmétique 1 et ne modifiez le mois que lorsque vous obtenez au-delà de le dernier jour de ce mois.

Notez que vous pouvez tester l'égalité entre les tuples, pas besoin de faire un test complet sur chaque élément. Le calcul de votre année bissextile nécessite également un petit raffinement:

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

Mille fois ça. 999 si vous êtes parti par un. –

+0

Est-ce que le niveleur CS101 d'Udacity le permet? C'est exactement la même réponse que le PO a reçue hier et n'a pas semblé aimer. – DSM

+0

c'est un test s'il vous plaît aidez-moi à trouver avec mon code. et spécifiez moi où je me suis trompé – user2649815