Calendario perpetuo

Da Wikipedia, l'enciclopedia libera.

Il calendario perpetuo è un algoritmo che permette di ricavare il giorno della settimana (lunedì, martedì, mercoledì, giovedì, venerdì, sabato, domenica) di un giorno qualsiasi, conoscendone solo la data. Nel corso dell'algoritmo si farà spesso uso dell'operazione di modulo indicata dal simbolo "mod" che altro non è che il resto della divisione (ad esempio: 18mod7=4 infatti 18/7=2 e il resto della divisione è 4).

L'algoritmo[modifica | modifica sorgente]

Presa una data gg/mm/ssaa, si chiamano:

Il numero corrisponde a con le limitazioni
gg giorno del mese da 1 a 31
aa ultime due cifre dell'anno (anno mod 100) da 0 a 99
ss prime due cifre dell'anno [int(anno / 100)] da 15 in avanti

Il giorno del mese modulo sette dà il primo addendo G della somma finale:

  • G = gg mod 7

Il secondo addendo M è dato dalla seguente tabella:

Mese M (anno non bisestile) M (anno bisestile)
Gennaio 0 6
Febbraio 3 2
Marzo 3
Aprile 6
Maggio 1
Giugno 4
Luglio 6
Agosto 2
Settembre 5
Ottobre 0
Novembre 3
Dicembre 5

Il terzo addendo A si ricava dalle ultime due cifre dell'anno:

  • A = aa mod 28 + int[(aa mod 28) / 4]

Ad esempio, per il 2008, il risultato dell'operazione è:

A = 8 mod 28 + int[(8 mod 28) / 4] = 8 + int(8 / 4) = 8 + 2 = 10

Il quarto addendo C deriva dal secolo, cioè dalle prime due cifre ss dell'anno: ai 4 possibili risultati di (ss mod 4), si associa un numero C tale che:

ss mod 4 0 1 2 3
C 6 4 2 0

Infine si calcola:

  • [(G + M + A + C) mod 7] se l'anno non è bisestile o se si sta calcolando un giorno di gennaio o di febbraio di un anno bisestile;

La formula fornisce un numero compreso tra 0 e 6 che indicherà il giorno della settimana:

Risultato Giorno
0 Domenica
1 Lunedì
2 Martedì
3 Mercoledì
4 Giovedì
5 Venerdì
6 Sabato

I giorni antecedenti il venerdì 15 ottobre 1582 non possono essere così calcolati a causa dell'entrata in vigore del calendario gregoriano.

Esempi[modifica | modifica sorgente]

Data: 15/04/2097

  • G = 15 mod 7 = 1
  • M = 6 (aprile)
  • A = 97 mod 28 + int[(97 mod 28) / 4) = 13 + int(13 / 4) = 13 + 3 = 16
  • C = 6 (ss = 20, 20 mod 4 = 0)
  • G + M + A + C = 1 + 6 + 16 + 6 = 29
  • 29 mod 7 = 1
  • Il giorno 15 aprile 2097 sarà un lunedì

Data: 22/10/2008

  • G = 22 mod 7 = 1
  • M = 0 (ottobre)
  • A = 8 mod 28 + int[(8 mod 28) / 4] = 8 + int(8 / 4) = 8 + 2 = 10
  • C = 6 (ss = 20, 20 mod 4 = 0)
  • G + M + A + C = 1 + 0 + 10 + 6 = 17
  • 17 mod 7 = 3
  • Il giorno 22 ottobre 2008 è stato un mercoledì

Data: 15/10/1582

  • G = 15 mod 7 = 1
  • M = 0 (ottobre)
  • A = 82 mod 28 + int[(82 mod 28) / 4]= 26 + int(26 / 4) = 26 + 6 = 32
  • C = 0 (ss = 15, 15 mod 4 = 3)
  • G + M + A + C = 1 + 0 + 32 + 0 = 33
  • 33 mod 7 = 5
  • Il giorno 15 ottobre 1582 è stato un venerdì

Altri progetti[modifica | modifica sorgente]

Collegamenti esterni[modifica | modifica sorgente]