calendrier
Même si aujourd’hui on a tous un téléphone avec un calendrier pour les trois mille prochaines années, on peut toujours se la jouer et calculer de tête le jour d’une date donnée.

La formule est assez simple mais demande de savoir faire quelques petits calculs de tête, comme 3+3+5 ou 10+1+3.

Il faut aussi connaître l’opérateur modulo, noté « % ». Le modulo c’est le reste de la division entière. Par exemple 10 % 7 (lire « 10 modulo 7 ») c’est le reste de 10÷7 c’est à dire 3. Plus compliqué, 22 % 7 c’est le reste de 22÷7, soit 1.
Ici on n’aura besoin que du module 7, mais cet opérateur peut être utilisé comme tous les autres, avec d’autres nombres.

La formule pour une date après l’an 2000, c’est ça :

[ (Jour à calculer)%7 + (Code de l’année)%7 + Code du mois ]%7 = Jour de la semaine.

Où :

  • Jour à calculer : c’est le jour du mois. Pour le 25 décembre, ce code est 25.
  • Code de l’année : c’est un code qui dépend de l’année. Il est égal aux deux derniers chiffres de l’année + le nombre d’années bissextiles depuis l’an 2000 (exclu). Pour l’an 2000, c’est 0+0. Pour l’an 2001, c’est 1+0. Pour l’an 2015, c’est (15+3). Le « 3 », c’est à cause des trois années bissextiles depuis l’an 2000 : 2004, 2008 et 2012.
  • Code du mois : chaque mois dispose d’un code qui dépend du nombre de jours qu’il contient et ceux des mois précédents. Il est plus facile d’apprendre les correspondances par cœur :
Janvier :6 (5 si l’année est bissextile)
Février :2 (1 si l’année est bissextile)
Mars :2
Avril :5
Mai :0
Juin :3
Juillet :5
Août :1
Septembre :4
Octobre :6
Novembre :2
Décembre :4

Pour avoir la date, il suffit de faire la somme.

Ainsi, pour Noël 2015 on calcule :

  • Jour à calculer ? 25. Modulo 7 : ça fait 4.
  • Code du mois ? C’est 4.
  • Code de l’année ? (15+3)%7=4
  • La somme 4+4+4 = 12.
  • 12 modulo 7, ça donne 5.

Ça y est : Noël 2015 tombera un donc le cinquième jour de la semaine, c’est à dire un vendredi.

Une autre date ? Prenons au hasard : 19 avril 2022.

  • Jour à calculer ? 19. Modulo 7, ça donne 5.
  • Code du mois ? C’est 5.
  • Code de l’année ? (22+5)%7=6.
  • La somme 5+5+6 = 16.
  • 16 modulo 7, ça donne 2.

C’est bon : le deuxième jour de la semaine c’est mardi. Le 19 avril 2022 sera un mardi.

Notez quelques trucs :

  • Cette formule fonctionne pour les années après l’an 2000. Il est possible de faire une formule pour les années avant aussi, mais je n’ai pas jugé utile de faire ça (il suffit de soustraire le nombre d’années bissextiles entre votre année et l’an 2000, en fait).
  • Les « modulo 7 » sont à utiliser ici parce que les semaines ont 7 jours, et que toutes les semaines on retrouve les mêmes jours. Donc qu’on prenne le 10e jour ou le 3e jour, il sera identique.
  • Le résultat donne le jour de la semaine : 1 pour lundi, 2 pour mardi, etc. Si vous savez 7, c’est dimanche. Si vous savez 0, c’est dimanche aussi. En fait, 7%7 reste possible et ça fait 0.
  • Pour trouver le nombre d’années bissextiles depuis l’an 2000, c’est simple : les années multiples de 4 sont bissextiles (2004, 2008, 2012, 16, 20…). Aussi, tous les 20 ans, on a 5 années bissextiles. Donc pour 2060, le nombre d’années bissextiles est 15. Le code de l’année 2060 sera donc (60+15)%7 soit 5.

(source, en anglais)

Image de Studio Curve

16 commentaires

gravatar
Arcturus a dit :

Génial ! C’est le genre de petites formules que j’adore, que ce soit pour s’amuser à les manipuler de tête ou si on en a besoin dans un bout de code ! :)

Par contre, arrête-moi si je me trompe, mais j’ai l’impression qu’il y a une petite confusion dans les termes que tu utilises : dans la formule il y a `(Jour à calculer)%7` et `(Code de l’année)%7` mais juste après tu inclus le modulo 7 dans la définition. Alors c’est vrai que `(a%b)%b = a%b` donc de toute façon ça marche, mais théoriquement ça rajoute deux opérations !

gravatar
Le Hollandais Volant a dit :

@Arcturus : c’est comme on veut en fait : le modulo peut s’appliquer n’importe quand, vu qu’il n’y a que de des additions.

Si je choisis de faire le modulo à l’intérieur des opérations aussi, c’est pour réduire tous les nombres avant de faire la somme : c’est plus simple.

Par exemple, pour le 26 janvier 2036 :
— avec le modulo à chaque fois, ça fait :
jour = [ 26%7 + (36+9)%7 + 5 ] %7
jour = [ 5 + 3 + 5 ] %7
jour = [ 13 ] %7
jour = 6, soit samedi.

(on aurait même plus moduler le 36 et le 9 séparément, ce qui aurait fait 1+2 soit 3 également)

— avec un seul modulo à la fin :
jour = [ 26 + (36+9) + 5 ] %7
jour = [ 76 ] %7
jour = 6, soit samedi.

La première méthode donne plus de calculs, mais ils sont plus simples. Je pense que pour beaucoup de personnes, c’est plus simple de faire plusieurs calculs simples qu’un seul calcul compliqué.

gravatar
yoran a dit :

génial comme petit truc a savoir!! =)
merci beaucoup

gravatar
MaximilienLIX a dit :

Merci beaucoup pour cette formule ! Franchement je la trouve juste bluffante ! :D
D'ailleurs j'ai bien envie d'en faire un petit programme. :)

gravatar
Le Hollandais Volant a dit :

@MaximilienLIX : Tu peux en faire un programme, mais c’est inutile : la plupart des langages de prog qui on intègrent la gestion du temps et des dates (php, Javascript, python…) permettent d’afficher le jour d’une date avec une seule commande.

en PHP : echo date('l', mktime(0, 0, 0, $Mois, $Jour, $Annee))

Je sais, c’est même plus marrant du coup…

gravatar
damien kojima a dit :

Bonjour,
chouette méthode pour déterminer le jour, mais je suis perdu dans mon résonnement quand je calcule mon annif.
Le 01/07/2015

1 modulo de 7, je fais comment ?

D'avance merci.

gravatar
Le Hollandais Volant a dit :

@damien kojima : 1%7, ça fait 1.

Le modulo, c’est le reste de la division euclidienne, et 1÷7, ça fait 0 et il reste 1. Le résultat est donc 1.

1%7 = 1
2%7 = 2

6%7 = 6
7%7 = 0
8%7 = 1
9%7 = 2


Tu peux faire calculer directement le modulo dans un moteur de recherche comme DDG : duckduckgo.com/?q=1%7
Ça marche aussi dans Google.

gravatar
damien kojima a dit :

@Le Hollandais Volant :
ok merci, par la même occasion je me suis entraîné à refaire des divisions euclidiennes.
Bien vu pour le moteur de recherche, je ne pense jamais à l'utiliser de la sorte.

ciao bon dimanche

gravatar
Guenhwyvar a dit :

Tiens, les commentaires sont revenus :o

Pour les années bissextiles, c'est un peu plus compliqué : faut que l'année soit divisible par 4 mais pas par 100, sauf si elle est aussi divisible par 400.
Selon ton énoncé, ça faussera les calculs à partir de 2100 (ou avant 1900).

gravatar
Le Hollandais Volant a dit :

@Guenhwyvar : faut que je vérifies, mais ce n’est pas sûr : on devra quand même compter le nombre d’années bissextiles, et tous les 100 ans, on n’en a pas (sauf si c’est divisible par 400, comme l’an 2000).

gravatar
kek.exe a dit :

Je dirais que c'est plus un truc de nerd que de geek...

gravatar
Non2 a dit :

Bonjour,

Chouette comme truc ! Mais outre la suppression d'un jour tous les 100 ans moins les années divisibles par 400, il y a aussi, pour les fans de dates historiques, le décalage de 10 jours lors de l'application du calendrier grégorien (le jeudi 4 octobre 1582 a précédé directement le le vendredi 15 octobre 1582).

Plus loin, il faudra aussi tenir compte qu'il n'y a pas eu d'an 0 et que le calendrier julien a été réformé (l'année 46 avant notre ère a duré 445 jours ! ).

gravatar
Alex a dit :

Ta formule est incomplète. Comme indiqué dans la source, il faut retrancher 1 aux codes des mois de Janvier et Février des années bissextiles.

Fais un test simple avec le 1er Janvier 2000:
Jour: 1
Mois: 6
Annee: 0
Cela nous donne 7%7 = 0 => Dimanche alors que le 1er Janvier 2000 était bien un Samedi!

Voici la note en question dans ta source:
Note: It's important to note that, in leap years, January reduces by one to 5, and February reduces by one to 1. The other years don't change in leap years. Leap years will be discussed in more detail later.

gravatar
Froidemort a dit :

Bonjour,

Toutes petites remarques :

"Le résultat donne le jour de la semaine : 1 pour lundi, 2 pour mardi, etc. Si vous savez 7, c’est dimanche. Si vous savez 0, c’est dimanche aussi. En fait, 7%7 reste possible et ça fait 0"
x%7 appartient à l'intervalle [0;6], donc on ne peut pas avoir 7 comme résultat.

De plus, pour l'année bissextile :
1. Si l'année est divisible par 4, passez à l'étape 2, sinon passez à l'étape 5.
2. Si l'année est divisible par 100, passez à l'étape 3. Sinon, passez à l'étape 4.
3. Si l'année est divisible par 400, passez à l'étape 4. Sinon, passez à l'étape 5.
4. L'année est une année bissextile (elle a 366 jours).
5. L'année n'est pas une année bissextile (elle a 365 jours).
Donc attention au décompte :)

gravatar
Curieux a dit :
Bonjour,

Cool comme méthode. Je me suis entrainé et parviens à déterminer la jour assez rapidement. Connaissant le code de l'année, le calcul mental se fait aisément. Si je choisis une autre année, c'est là que je bute à cause du fragement "(A+A/4)%7" qui donne le code de l'année, ca me prend un peu de temps de faire le calcul mental. Y a t'il une astuce pour avoir assez rapidement le résultat de "(A+A/4)%7" ?

Merci

Les commentaires sont fermés pour cet article