La congruence de Zeller

Après la distance de Levenshtein, voici la congruence de Zeller...

Julius Christian Johannes Zeller est un mathématicien allemand de la fin du 19ème siècle. Son travail le plus remarquable est sans doute sa relation de congruence permettant de calculer le jour de la semaine de n’importe quelle date du calendrier grégorien.

Par exemple, la congruence de Zeller est capable de dire que le 18 octobre 1983 (le jour de ma naissance) était un mardi. Ca vous fait peut-être une belle jambe de savoir cela, mais ça peut-être très utile en programmation, notamment pour dessiner des calendriers comme ceci ou comme cela.

La formule de la congruence de Zeller est la suivante :

Formule de la congruence de Zeller

* h est le jour de la semaine (0 = samedi, 1 = dimanche, 2 = lundi, …, 6 = vendredi).
* q est le jour du mois.
* m est le mois (3 = mars, 4 = avril, …, 12 = décembre). Janvier et février sont considérés comme les mois 13 et 14 de l’année précédente.
* J est le centenaire. Pour 2008, c’est 20. On le calcule en faisant la division entière de l’année par 100.
* K est l’année dans le centenaire. Pour 2008, c’est 8. On la calcule en faisant l’année modulo 100.

Les crochets dans la formule représentent la division entière.

Pour le 1er janvier 2008 (traité comme le premier jour du treizième mois de l’année 2007), on a donc les valeurs suivantes :

* q = 1
* m = 13
* J = 20
* K = 7

Après calcul, la valeur de h est 3, ce qui équivaut à mardi (vérifiez dans vos calendriers).

Pour le 18 octobre 1983, on a les valeurs suivantes :

* q = 18
* m = 10
* J = 19
* K = 83

Après calcul, la valeur de h est 3, ce qui équivaut une nouvelle fois à mardi.

Sur cette page, vous trouverez un petite application qui utilise la congruence de Zeller. Entrez une date et vous obtiendrez le jour ! Le script a été réalisé en JavaScript (affichez la source pour le voir). Je n’ai pas fait de vérifications particulières donc essayez d’entrer des données correctes :-p

Si vous souhaitez afficher un calendrier, vous devrez également tenir compte des règles compliquées permettant de calculer si une année est bissextile ou non

Bon amusement !

10 Comments

  1. Julg7's avatar Julg7 says:

    Excellent ! J’adore les algo comme ça ^^
    Merci pour l’explication 🙂

    Like

  2. Marin's avatar Marin says:

    J’aurais voulu avoir un prof de math comme toi :p

    mais bon je pense pas que les calendries JS emploient la formule en question. L’objets objets Date ont des méthodes pour retrouver le jour de la semaine aussi.

    En tout cas c’est vraiment bizarre que la semaine de Zeller commence un … samedi. Une histoire de religion/culture?

    Like

  3. Martius's avatar Martius says:

    peut-être plutôt une question de maths !?

    Like

  4. vinch's avatar Vinch says:

    C’est plutôt une question de maths en effet. Si tu veux que h vale 0 pour lundi, il te suffit de faire un décalage de 2 (+5 mod 7)

    Like

  5. Cyril's avatar Cyril says:

    c’est vrai qu’expliqué comme ça, c’est vachrmrnt classe 🙂

    Like

  6. Unknown's avatar Bartdude says:

    Ca me choque moins que la semaine commence le samedi que l’année commence en mars, tout en gardant le numéro 3 pour ce mois…

    Like

  7. vincenzo's avatar vincenzo says:

    Heuu si je rentre le 27/09/2008 il me sort jeudi hors c’est un samedi non ?

    Like

  8. Marin's avatar Marin says:

    @vincenzo, c’est du au parseInt qui n’a pas de base -> si la valeur passée au parseInt commence par un 0, la base est considérée comme 8

    -> @vinch,
    var day=parseInt(date.substr(0,2),10);
    var month=parseInt(date.substr(3,2),10);

    et ca retourne bien samedi pour le 27/09/2008
    et j’aurais plutot fait un split(‘/’) sur la valeur perso qu’un substr()

    Like

  9. sk's avatar sk says:

    Bonsoir,

    En testant le site “https://vinch.be//attic/zeller.html” pour vérifier le jour d’une date précise
    et j’ai pris le 08/06/1963 ton site montre vendredi (?) , alors qu’en réalité c’est un un samedi.

    A+

    Like

  10. la vérité's avatar la vérité says:

    y a un bug,

    faite le test avec 1/10/2010, il affiche que c’est un samedi, alors qu’en vérité le 1 er octobre 2010 tombe un vendredi ! ?

    Like

Leave a reply to vincenzo Cancel reply