Ricordo 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ì |