[bottega] Un trucchetto

  • From: Massimiliano Mirra <mmirra@xxxxxxxxx>
  • To: bottega@xxxxxxxxxxxxx
  • Date: Wed, 15 Jan 2003 19:10:50 +0100

Leggere, conservare e confrontare delle date puo` portare via molto
tempo e codice.  Di solito si crea una classe Data con questa
interfaccia:

class Data {
    public Data(int giorno, int mese, int anno);
    public int getGiorno();
    public int getMese();
    public int getAnno();
    public int compareTo(Data altraData);
}

Cosa facciano getGiorno(), getMese() e getAnno() e` banale.  compareTo
confronta due date e restituisce un numero minore, maggiore o uguale a
zero, a seconda che la prima data sia minore, maggiore o uguale alla
seconda.  Per esempio:

    Data d1 = new Data(10, 2, 2002); // 10 febbraio 2002
    Data d2 = new Data(15, 10, 2000); // 15 ottobre 2000
    if (d1.compareTo(d2) > 0) {
        System.out.println("La prima e` piu` grande della seconda.)
    } else if (d1.compareTo(d2) < 0) {
        System.out.println("La prima e` piu` piccola della seconda.)
    } else {
        System.out.println("La prima e` uguale alla seconda.)
    }

Scrivere la classe Data puo` essere abbastanza dispendioso in termini
di tempo.  D'altronde puo` sembrare l'unica via quando ci sono da fare
confronti fra date.  Infatti, il seguente (semplicistico) confronto
tra date contenute in stringhe restituirebbe un risultato errato:

    String d1 = "10-02-2002";
    String d2 = "15-10-2000";
    if (d1.compareTo(d2) > 0) {
        System.out.println("La prima e` piu` grande della seconda.)
    } else if (d1.compareTo(d2) < 0) {
        System.out.println("La prima e` piu` piccola della seconda.)
    } else {
        System.out.println("La prima e` uguale alla seconda.)
    }

Infatti stamperebbe: La prima e` piu` piccola della seconda.
Nonostante la prima sia del 2002, essa comincia per 10 mentre la
seconda comincia per 15, percio` la seconda risulta piu` grande.
L'ordine di confronte cioe` e` quello alfabetico.

Ora vi presento un trucco semplicissimo che potrete usare nei
programmi che richiedono confronti fra date, quando non avete il tempo
di creare una intera classe `Data'.  Il trucco consiste nel
riorganizzare il formato della data in modo che il confronto
alfabetico lavori a nostro vantaggio.

Normalmente scriviamo le date nel formato `gg-mm-aaaa', cioe` DUE
caratteri per il giorno, seguiti da DUE per il mese, seguiti da
quattro per l'anno, come nell'esempio di sopra.  Ebbene, semplicemente
scrivendo queste componenti in ordine inverso, ecco che l'ordinamente
alfabetico corrisponde a quello del tempo: `aaaa-mm-gg'.  Adattando
l'esempio di prima, vediamo che ora restituisce il risultato corretto:

    String d1 = "2002-02-10";
    String d2 = "2000-10-15";
    if (d1.compareTo(d2) > 0) {
        System.out.println("La prima e` piu` grande della seconda.)
    } else if (d1.compareTo(d2) < 0) {
        System.out.println("La prima e` piu` piccola della seconda.)
    } else {
        System.out.println("La prima e` uguale alla seconda.)
    }




Massimiliano

Other related posts:

  • » [bottega] Un trucchetto