====== Trouver le jour pour une date ====== ===== Quel calendrier ? ===== Quel jour de la semaine était le 10 avril 1845 ? et quel jour sera le 1 janvier 2058 ? C'est à ce genre de question que l'on va essayer de répondre. Avant 1582, l'Europe pratiquait le calendrier julien pour lequel les années bissextiles revenaient tous les 4 ans ce qui produit un décalage de 3 jours sur 400 ans par rapport à un calendrier astronomique. En 1582 l'Europe a adopté le calendrier grégorien. La transition n'a pas été la même partout. En France, le lendemain du 9 décembre 1582 (julien) a été le 20 décembre 1582 (grégorien). Nous limiterons notre travail au calendrier grégorien, donc notre programme ne fonctionnera que pour des dates postérieures à 1582. D'ailleurs, il ne faut pas trop imaginer que l'ensemble de l'Europe était parfaitement synchronisée dans les temps anciens ! === Années bissextiles === Dans le calendrier grégorien, sont bissextiles : * les années multiples de 4, * mais pas les années centenaires -- 1800, 1900 * tous les 400 ans, la règle précédente ne s'applique pas : 1600 et 2000 étaient bissextiles L'année sidérale, temps mis par la Terre pour parcourir son orbite, est de 365 jours, 6 heures et 9 minutes. Mais ce n'est pas elle que l'on utilise pour les calendriers. On utilise plutôt l'année tropique, c'est à dire le temps nécessaire pour que l'écliptique du soleil (sa trajectoire dans le ciel pour une journée) reviennent à la même position. C'est le temps du retour des saisons. La durée de l'année tropique fluctue légèrement, mais elle est d'environ 365,2425 jours, soit : $$365 + \frac{1}{4} - \frac{1}{100} + \frac{1}{400}$$ Ces valeurs sont approximatives et il est probable qu'il faille faire des corrections dans les siècles avenir -- il arrive par exemple que l'on ajoute 1 seconde au 31 décembre d'une année pour recaler notre temps de tous les jours avec les horloges atomiques. On peut donc considérer que notre programme ne sera plus valable pour des dates très éloignées dans le futur. ===== Quoi faire ? ===== === Modulo === {{ horloge.png?nolink&100|}} Quand une semaine se termine, on commence la suivante. Cela ressemble à un cercle, à la fin du parcours, on recommence. C'est l'utilisation typique d'un modulo. Pour être plus concret, prenez les 12 points d'une horloge (heures). Placez vous sur le 1. Avancez dans le sens des aiguilles de 4732 points. Sur quel point arrivez vous ? On peut bien sûr compter et voir où on arrive. Mais il est plus efficace de pensez que chaque fois qu'on avance de 12, on revient au point initial. Donc chaque fois que l'on aura ôté 12 au total de 4732, on n'aura pas bougé. Quand on ôte autant de fois que l'on peut 12 de 4732, que reste-t-il ? C'est exactement le calcul fait par l'opérateur **modulo**. >>> 4732 % 12 4 Donc si j'avance de 4732, je vais faire un certain nombre de tours complets -- combien ? Peu importe. Et il me restera 4 pas à faire. Partant de 1 on arrive donc à 5. === Le 1/01/2001 ? === Reprenons l'idée pour le calendrier. Sachant que le 1er janvier 2000 était un samedi, quel jour était le 1er janvier 2001 ? L'année 2000 étant bissextile, il y a 366 jours du 1/01/2000 au 1/01/2001. Puis ''%%366 % 7 = 2%%'', donc le 1/01/2001 est 2 jours de la semaine après le samedi, c'était un **lundi**. >>> jours = ['samedi', 'dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi'] >>> 366 % 7 2 >>> jours[2] 'lundi' === Le 1/01/1995 === Les années 1995, 1997, 1998 et 1999 ne sont pas bissextiles mais 1996 oui, donc : >>> 4 * 365 + 366 1826 >>> 1826 % 7 6 >>> jours = ['samedi', 'dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi'] >>> (-4 * 365 - 366) % 7 1 >>> jours[1] 'dimanche' === Le 12/03/1995 === Le 14/03/1995 vient 31 jours (janvier) plus 28 jours (février) plus 13 jours après le 1/01/1995, le calcul devient : >>> jours = ['samedi', 'dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi'] >>> (-4 * 365 - 366 + 31 + 28 + 13) % 7 3 >>> jours[3] 'mardi' === À vous ! === Concevez un programme auquel on fournit l'année, le numéro du mois (janvier = 1) et le jour, et qui répond par le jour de la semaine.