Doomsday - Calcolo del giorno della settimana

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;
}

Grazie della segnalazione. :grin:
Usa funzione simile è integrata nella libreria SwRTC di Leo --> Arduino Forum