GERBELOTBARILLON.COM

Parce qu'il faut toujours un commencement...

Calculer l'écart entre deux dates revient à compter le nombre de jours par rapport à une date de référence et à faire ensuite la différence entre les deux dates obtenues. La contrainte à prendre en compte est le fait que les années soient potentiellement bissextiles, de même que certains siècles. Dans un autre snippet j'explique tout cela donc je ne m'étendrai pas dessus.

Dans le calcul manuel, nous prenons le parti de supposer que chaque année fait 365 jours + 1/4 de jour soit 365,25 jours. Cela peut fausser le calcul de prime abord mais l'application de la fonction int() va permettre de retirer les décimales s'il y en reste en fin de calcul. Ensuite il nous faut ajouter ou soustraire le nombre de siècles qui séparent les deux dates et s'adapter à leurs particularités pour retrancher les jours comptés en trop. Si une année bissextile tombe tous les 4 ans, et que 1896 était une de ces années, le calendrier doit nous annoncer que 1900 était alors bissextile. Ce qui n'est pas le cas en fait...et il faut donc l'enlever du décompte.

Version avec les bibliothèques système

from datetime import date

d1 = date(1666, 10, 10)
d2 = date(1971, 10, 10)
print(abs(d2 - d1).days)

Une autre façon de traiter avec les méthodes de la bibliothèque datetime est d'utiliser divmod().

import datetime
import time

now = int(time.time()) # temps au format epoch
then = now - 324 # retour en arrière

d = divmod(now - then, 86400) # donne les jours
h = divmod(d[1], 3600) # donne les heures
m = divmod(h[1], 60) # donne les minutes
s = m[1] # donne les secondes

print('%d jours, %d heures, %d minutes, %d secondes' % (d[0], h[0], m[0], s))

Version sans bibliothèques

# Tableau indiquant le nombre de jours pour arriver au mois en question
# Pour arriver au 1er Janvier il faut 0 jours, pour arriver au 1er Mars il faut 59.25 jours
jours = [0, 31, 59.25, 90.25, 120.25, 151.25, 181.25, 212.25, 243.25, 273.25, 304.25, 334.25]

# Conversion de la date en jours depuis le début du calendrier grégorien
def date_to_int(j, m, a):
   return int(365.25 * (a - 1582) + jours[m-1] + j)

# Détermine si l'année est bissextile ou non
def is_bissextile(annee):
   bis = False
   if ((annee % 4 == 0) and (annee % 100 != 0)) or (annee % 400 == 0):
      bis = True
   return bis

# Saisie de la première date
j1 = int(input("Jour 1  >> "))
m1 = int(input("Mois 1  >> "))
a1 = int(input("Année 1 >> "))
d1 = date_to_int(j1, m1, a1)

# Saisie de la deuxième date
j2 = int(input("Jour 2  >> "))
m2 = int(input("Mois 2  >> "))
a2 = int(input("Année 2 >> "))
d2 = date_to_int(j2, m2, a2)

# Correction à apporter sur les siècles 
siecles = int(abs(a2 - a1) / 100)
i = a1
sb = 0
while i < a2:
   if int(i % 100) == 0:
      print(i)
      if is_bissextile(i):
         sb += 1 # Siècle bissextile
      else:
         sb -= 1 # Siècle non bissextile
   i += 1

diff = (abs(d2-d1)+sb)
print("Différence de", diff, "jours entre les deux dates")

Nous pouvons apercevoir une différence de complexité entre l'utilisation de la bibliothèque datetime de python et l'ensemble des calculs à réaliser pour obtenir une valeur respectant les bizarreries du calendrier...mais c'est bien de savoir pourquoi cela se passe ainsi.