Ciao br1,
innanzitutto vorrei ringraziarti per aver postato un versione più breve ed efficace del codice.

Vorrei però farti delle domande sul codice da te postato.

1) Come mai le variabili (aa,mm,gg) dentro il while, non presentano il punto e virgola dopo il loro incremento?
codice:
 mm++ //No c'è il punto e virgola
2)Perché una volta che hai compiuto le operazioni entro il while, una volta uscito le decrementi di 1?
codice:
 oggi.setFullYear(oggi.getFullYear()-1); 
  aa--;
3)Perché quado operi con i giorni non segui un procedimento uguale a quello dei mesi e degli anni, mafai solo gg--?
codice:
 gg--;
Ciao e grazie.

P.S. Lo so che sono un po' di domande, ma non mi piace copiare le cose e basta, io voglio cercar di capire il meccanismo e il ragionamento che ci è dietro.