1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
nbr_jours = [0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]
nbr_jours_b = [0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366] # année bissextile
def is_bissextile(annee):
return annee % 4 == 0 and (annee % 100 != 0 or annee % 400 == 0)
# différence entre deux dates d'une même année
# format date : (j,m,a)
def diff_dates_meme_annee(d1, d2):
if d1 == d2:
return 0
# juste pour la lisibilité...
(j1, m1, a1) = d1
(j2, m2, a2) = d2
lst_nbr_jours = nbr_jours
if is_bissextile(a1):
lst_nbr_jours = nbr_jours_b
# nombre de jours entre le 01/01 et d1 non inclus
nbr_jours_annee_d1 = j1 + lst_nbr_jours[m1]
# nombre de jours entre le 01/01 et d2 non inclus
nbr_jours_annee_d2 = j2 + lst_nbr_jours[m2]
return nbr_jours_annee_d2 - nbr_jours_annee_d1
def nbr_annees_bissextiles(a1, a2):
if a1 == a2:
return 0
a1, a2 = a1 - 1, a2 - 1
return (a2 // 4) - (a1 // 4) - ((a2 // 100) - (a1 // 100)) + (a2 // 400) - (a1 // 400)
def diff_dates(d1, d2):
(j1, m1, a1) = map(int, d1.split("/"))
(j2, m2, a2) = map(int, d2.split("/"))
diff = a2 - a1
if diff == 0:
return diff_dates_meme_annee((j1, m1, a1), (j2, m2, a2))
nbr_jours_annees_completes = 365 * \
(diff-1) + nbr_annees_bissextiles(a1 + 1, a2)
# nombre de jours à prendre en compte dans dans l'année a1
# ---> nombre de jours entre d1 et le 31/12/a1 inclus
nbr_jours_a1 = 1 + diff_dates_meme_annee((j1, m1, a1), (31, 12, a1))
# nombre de jours à prendre en compte dans dans l'année a2
# ---> nombre de jours entre le 01/01/a2 et d2 non inclus
nbr_jours_a2 = diff_dates_meme_annee((1, 1, a2), (j2, m2, a2))
return nbr_jours_a1 + nbr_jours_a2 + nbr_jours_annees_completes |