Seleziona la tua lingua

Calcolo del giorno della settimana

CalendarioRicordo lo stupore che provai quando iniziai a programmare e scoprii le funzioni di libreria. Questo mondo magico ed ermetico, fatto di funzioni e metodi di cui non si riusciva a comprendere l'implementazione, risolvevano problemi in modo rapido, preciso ma anche misterioso. Quando si lavorava con le date poi sembrava che queste funzioni estrapolassero dati da fonti inaccessibili. Oggi mi rendo conto che dietro ogni funzione ci sono sempre poche righe di sapiente codice e tanto ingegno. Per lavoro mi capita spesso di occuparmi di sistemi che per funzionare devono risalire alla giornata lavorativa precedente nella settimana, e ciò generalmente si traduce nella giornata precedente, ma non il lunedì. Le librerie di funzioni, oggi come allora, mettono a disposizione metodi per estrarre da una data il giorno della settimana, cosa che diciotto anni fa suscitava in me una certa meraviglia, mista ad un religioso stupore. Eppure dietro c'è poco più che un po' di algebra lineare, ma come sempre è l'idea che conta. Ecco quella di Claus Tøndering.

L'algoritmo di Claus Tøndering usa una variante del metodo di congruenza di Gauss. Dati G, M e A i valori del giorno, mese e anno della data da considerare. I tre coefficienti x, y, e z vegono così inizializzati:

x = INT((14 - M) / 12)

y = A - x

z = M + 12x - 2

A questo punto, si procede in modo diverso a seconda che la data sia o meno antecedenti l'entrata in vigore del calendario Gregoriano (4 ottobre 1582):

  • W = (5 + G + y + DIV(y, 4) + DIV(31z, 12)) MOD 7; (Calendario Giuliano)
  • W = (G + y + DIV(y, 4) - DIV(y, 100) + DIV(y, 400) + DIV(31z, 12)) MOD 7. (Calendario Gregoriano)

La funzione DIV() rappresenta la divisione intera di due numero, mentre MOD è l'operatore di modulo, cioè il resto della divisione intera. W rappresenta il giorno della settimana e va da 0 (domenica) a 6 (sabato). A questo punto è facile mappare il numero su qualsivoglia stringa di caratteri. La tabella che segue riporta il giorno della settimana per le giornate di capodanno dal 1980 al 2015:

Anno x y z   W Giorno della settimana
1980 1 1979 11 2487 2 Martedì
1981 1 1980 11 2489 4 Giovedì
1982 1 1981 11 2490 5 Venerdì
1983 1 1982 11 2491 6 Sabato
1984 1 1983 11 2492 0 Domenica
1985 1 1984 11 2494 2 Martedì
1986 1 1985 11 2495 3 Mercoledì
1987 1 1986 11 2496 4 Giovedì
1988 1 1987 11 2497 5 Venerdì
1989 1 1988 11 2499 0 Domenica
1990 1 1989 11 2500 1 Lunedì
1991 1 1990 11 2501 2 Martedì
1992 1 1991 11 2502 3 Mercoledì
1993 1 1992 11 2504 5 Venerdì
1994 1 1993 11 2505 6 Sabato
1995 1 1994 11 2506 0 Domenica
1996 1 1995 11 2507 1 Lunedì
1997 1 1996 11 2509 3 Mercoledì
1998 1 1997 11 2510 4 Giovedì
1999 1 1998 11 2511 5 Venerdì
2000 1 1999 11 2512 6 Sabato
2001 1 2000 11 2514 1 Lunedì
2002 1 2001 11 2515 2 Martedì
2003 1 2002 11 2516 3 Mercoledì
2004 1 2003 11 2517 4 Giovedì
2005 1 2004 11 2519 6 Sabato
2006 1 2005 11 2520 0 Domenica
2007 1 2006 11 2521 1 Lunedì
2008 1 2007 11 2522 2 Martedì
2009 1 2008 11 2524 4 Giovedì
2010 1 2009 11 2525 5 Venerdì
2011 1 2010 11 2526 6 Sabato
2012 1 2011 11 2527 0 Domenica
2013 1 2012 11 2529 2 Martedì
2014 1 2013 11 2530 3 Mercoledì
2015 1 2014 11 2531 4 Giovedì