class Data { // Attributo costante: giorni in ogni mese private static final int[] GIORNI_IN_MESE = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 31, 30, 31}; // Attributi variabili private int giorno; private int mese; private int anno; // Costruttore public Data( int gg, int mm, int aa ) { giorno = gg; mese = mm; anno = aa; } // Metodi di restituzione public int giorno() { return giorno; } public int mese() { return mese; } public int anno() { return anno; } // Metodo per calcolare la differenza tra due date (in giorni) public int sottrai( Data d ) { if (maggioreDi(d)) { if (anno > d.anno()) { // Calcola i giorni da d alla fine dell'anno di d int t = sottraiStessoAnno(31, 12, d.giorno, d.mese); // Calcola i giorni nella differenza tra gli anni - 1 t += (anno - d.anno - 1) * 365; // Calcola i giorni dall'inizio dell'anno di this a this t += sottraiStessoAnno(giorno, mese, 1, 1); return t; } else { return sottraiStessoAnno(giorno, mese, d.giorno, d.mese); } } else { return 0; } } // Metodo per confrontare due date public boolean maggioreDi( Data d ) { if (anno > d.anno()) { return true; } else if ((anno == d.anno) && (mese > d.mese)) { return true; } else if ((anno == d.anno) && (mese == d.mese) && (giorno > d.giorno)) { return true; } return false; } // Metodo per sottrarre giorni e mesi all'interno dello stesso anno private int sottraiStessoAnno(int g1, int m1, int g2, int m2) { // Trasforma le due date in mesi dall'inizio dell'anno e le sottrae int d1 = g1; for (int m = 1; m < m1; ++m) { d1 += GIORNI_IN_MESE[m]; } int d2 = g2; for (int m = 1; m < m2; ++m) { d2 += GIORNI_IN_MESE[m]; } return (d1 - d2); } }