giovedì 1 settembre 2011

Gestire Date con la libreria JODA


La libereria Joda (http://joda-time.sourceforge.net/index.html) ha come obiettivo quello di semplificare il lavoro in Java quando si ha  a che fare con operazioni tra oggetti di tipo Date (formattazioni, confronti tra date, date in fusi orari diversi ecc.).
E’ molto ben documentato tutto sul sito, di seguito posto qualche esempio che mi sono creato per simulare alcune delle casistiche più comuni.
Ho utilizzato l’ultima versione rilasciata il 31/07/2011, joda 2.0.
Per utilizzarlo in un progetto Java basta aggiungerlo al classpath.
Se si utilizza Eclipse come IDE posizionarsi sul progetto quindi Properties/Java Build Path/Libraries e quindi premere il pulsante Add Jar per aggiungere il jar al classpath.


Creare una java.util.Date passando anno mese e giorno


public static Date getData(int giorno,int mese,int anno){
            DateTime dt=new DateTime(anno, mese, giorno, 0, 0);
            return dt.toDate();
      }







Calcolare la differenza di giorni e mesi tra due date


public static int getDifferenzaGiorniTraDate(Date data1,Date data2){
           
            DateTime d1=new DateTime(data1);
            DateTime d2=new DateTime(data2);
            return Days.daysBetween(d1, d2).getDays();
      }
public static int getDifferenzaMesiTraDate(Date data1,Date data2){
           
            DateTime d1=new DateTime(data1);
            DateTime d2=new DateTime(data2);
            return Months.monthsBetween(d1, d2).getMonths();
      }











Il risultato sarà positivo se d1<2 negativo se vale il viceversa.

Stampare il valore di una java.util.Date personalizzandolo in base al Locale


public static String stampaData(Locale l,Date d)
      {
            DateTime dt=new DateTime(d);
            String giorno=dt.dayOfMonth().getAsText(l);
            String mese=dt.monthOfYear().getAsText(l);
            int meseInt=dt.monthOfYear().get();
            String anno=dt.year().getAsText(l);
            String giornoDellaSettimana=dt.dayOfWeek().getAsText(l);
            StringBuffer sb=new StringBuffer();
            sb.append(giornoDellaSettimana);
            sb.append(" ");
            sb.append(giorno);
            sb.append(" di ");
            sb.append(mese);
            sb.append(" dell'anno ");
            sb.append(anno);
            sb.append("\n");
            sb.append(giornoDellaSettimana);
            sb.append(" ");
            sb.append(giorno);
            sb.append("/");
            sb.append(meseInt);
            sb.append("/");
            sb.append(anno);
            return sb.toString();
      }




Se invocato così, con la data di oggi 1 settembre 2011:


System.out.println(stampaData(Locale.ITALY, new Date()));
                 
                 


Produce il seguente risultato

giovedì 1 di settembre dell'anno 2011


Ottenere  la data in un altro fuso orario


/**
       * lista fusi qui: http://joda-time.sourceforge.net/timezones.html
       * @param d
       * @param fuso
       * @return
       */
      public static Date getDataAltroFusoOrario(Date d,String fuso){
             DateTime dt = new DateTime(d);
             DateTime retDate=dt.withZoneRetainFields(DateTimeZone.forID(fuso));
             return retDate.toDate();
      }


Qui forse si poteva creare un enum per gestire i vari fusi orari (non è detto che non ci sia, io ho dato solo uno sguardo veloce alla libreria).

E’ possibile ottenere una lista di tutte le Stringhe utilizzate per i fusi orari sia all’url:


oppure via codice così:


public static ArrayList<String> getListaFusi(){
            ArrayList<String> l=new ArrayList<String>();
            Set<String> insieme=DateTimeZone.getAvailableIDs();
            for(String s: insieme){
                  l.add(s);
            }
            return l;
      }


Esempio:

Invocando il metodo così:

System.out.println(getDataAltroFusoOrario(new Date(), "Europe/Athens"));
                 


Otteniamo (al momento del lancio sono le 12:44 in Italia)

Thu Sep 01 11:44:47 CEST 2011  

Formattazione di una data

La formattazione delle date in realtà è già agevole con il SimpleDateFormat di java (package java.text)

Di seguito comunque un esempio

public static String stampaDataFormattata(Date d,String pattern){
      DateTimeFormatter df=DateTimeFormat.forPattern(pattern);
      DateTime dt=new DateTime(d);
      return dt.toString(df);
}


Richiamando il metodo così (sempre con data di oggi 1 settembre 2011):

System.out.println(stampaDataFormattata(new Date(), "yyyyMMdd"));


Otteniamo:  20110901

Nessun commento:

Posta un commento