lunedì 22 agosto 2011

Confrontare date in Java

Nell’effettuare una comparazione tra due date bisogna stare attenti all’utilizzo del metodo getTime().
Spesso infatti quello che ci serve è soltanto paragonare le date in base a giorno mese e anno mentre il metodo getTime() tiene conto anche delle ore minuti secondi e millisecondi.

Può essere fuoriviante il seguente codice:

Date d1=new Date();
Date d2=new Date();
System.out.println(d1.getTime()==d2.getTime());

Se si prova ad eseguirlo il risultato sarà quasi sempre true, poiché d1 e d2 vengono create praticamente nello stesso istante, millisecondo compreso.
Se proviamo ad inserire però un Thread.sleep(1000) tra le due dichiarazioni di date vediamo che il risultato torna false, in quanto d2 ha 1 secondo in più di d1.

Anche se ci costruiamo una data usando l’oggetto Calendar in questo modo (come visto in un precedente post )


public static Date creaData(int giorno,int mese,int anno){
              Calendar c=Calendar.getInstance();
              c.set(Calendar.YEAR, anno);
              c.set(Calendar.MONTH, mese-1);
              c.set(Calendar.DAY_OF_MONTH, giorno);
              return c.getTime();
          }


Si verifica lo stesso problema se tra d1 e d2 passa anche solo un millisecondo di differenza.

Le soluzioni possono essere due:
  1. Utilizzare  Joda , una api appositamente creata per velocizzare le operazioni sulle Date, da sempre un tallone d’Achille del linguaggio Java (su cui conto di fare un post a breve);
  2. Modificare il metodo creaData inserendo anche ore minuti secondi e millisecondi

Se usiamo il metodo 2 e riscriviamo così il metodo creaData:


public static Date creaData(int giorno,int mese,int anno){
            Calendar c=Calendar.getInstance();
            c.set(Calendar.YEAR, anno);
            c.set(Calendar.MONTH, mese-1);
            c.set(Calendar.DAY_OF_MONTH, giorno);
            c.set(Calendar.HOUR_OF_DAY, 0);
            c.set(Calendar.MINUTE, 0);
            c.set(Calendar.SECOND, 0);
            c.set(Calendar.MILLISECOND, 0);
            return c.getTime();
      }



Il problema è risolto, e le date saranno finalmente paragonate senza tener conto dei loro diversi istanti di creazione.


Nessun commento:

Posta un commento