E' proprio vero che non si smette mai di imparare.
Ho recentemente affrontato il problema del calcolo del giorno della settimana e su Wikipedia ho trovato questo interessante algoritmo che utilizzavo (senza sapere cosa diavolo era) in ambiente BASIC.
Oltre al mero calcolo del giorno della settimana, può servire a calcolare le date di inizio e fine dell'ora legale oppure della Pasqua.
Invito gli interessati al leggere l'argomento su Wikipedia
Ettore Massimo Albani
byte WeekDay(byte GG, byte MM, int AAAA) { // 0=Dom, 1=Lun, 2=Mar, 3=Mer, 4=Gio, 5=Ven, 6=Sab
int I;
int Century = AAAA / 100 + 1; // secolo (2012 = 21)
int CenturyYear = AAAA % 100; // anno del secolo (2012 = 12)
int CenDooms = ((5 * Century + (Century - 1) / 4) % 7 + 4) % 7; // doomsday del secolo (21° = 2 = Mar)
int YearDooms = (CenturyYear + CenturyYear / 4) % 7 + CenDooms; // doomsday dell'anno (2012 = 3 = Mer)
switch(MM) {
case 1: // Gennaio
if (AAAA % 4 > 0) I = 3; // solare
else I = 4; // bisestile
break;
case 2: // Febbraio
if (AAAA % 4 > 0) I = 7; // solare
else I = 1; // bisestile
break;
case 3: // Marzo
I = 7;
break;
case 5: // Maggio
I = 9;
break;
case 7: // Luglio
I = 11;
break;
case 9: // Settembre
I = 5;
break;
case 11: // Novembre
I = 7;
break;
default: // mesi pari
I = MM;
}
I = GG - I + YearDooms;
if (I < 0) I += 7;
I = I % 7;
return I;
}