Gestione delle Date e Calendar

INDICE TUTORIAL

La classe java.util.Date è usata per rappresentare le date. Si può istanziare nei seguenti modi:

        Date data1 = new Date();
	Date date2 = new Date(System.currentTimeMillis());

Entrambe le linee di codice istanziano un oggetto che incapsula la data corrente. 

Per rappresentare una stringa come  una data e, viceversa,  ottenere un oggetto Data da una stringa, formattata correttamente, si usa la classe SimpleDateFormat

Esempio:

	    SimpleDateFormat sdf = new SimpleDateFormat(); // creo l'og-getto
	    String dataStr = sdf.format(new Date()); // data corrente (20 febbraio 2014)
	    
	    // output atteso: 2014, 02, 20
	    sdf.applyPattern("yyyy, MM, dd");  
	    System.out.println(dataStr);  
	         
	    // output atteso: 2014-02-20
	    sdf.applyPattern("yyyy-MM-dd");
	    System.out.println(dataStr);  

	    // output atteso: 20/02/2014
	    sdf = new SimpleDateFormat("dd/MM/yyyy");
	    System.out.println(dataStr);
	         

Il pattern di simpleDateFormat si può assegnare anche nel momento in cui si crea l’istanza:

sdf = new SimpleDateFormat("dd MMMM yyyy");

o successivamente, tramite il metodo applyPattern

sdf.applyPattern("yyyy, MM, dd");  

Le  lettere per la definizione dei pattern vengono in genere ripetute più volte. Ad esempio se vogliamo che l’anno sia rappresentato interamente ripeteremo 4 volte la lettera “y”, se invece vogliamo solo le ultime due lettere ripeteremo la “y” solo due volte.

Di seguito le lettere che si utilizzano più frequentemente per la formattazione dell’output:

y (anno) – se ripetuto quattro volte stampa l’anno completo, se ripetuta due volte stampa solo le ultime due cifre dell’anno;

M (mese) – se ripetuto 3 o più volte il mese è interpretato come stringa (es: Febbraio), in caso contrario come numero (es: 02);

d (giorno del mese) – deve essere ripetuto due volte; stampa sempre un valore numerico;

H (ora del giorno) – deve essere ripetuto due volte; stampa sempre un valore numerico (da 0 a 23);

m (minuti) – deve essere ripetuto due volte; stampa sempre un valore numerico (da 0 a 59);

s (secondi) – deve essere ripetuto due volte; stampa sempre un valore numerico (da 0 a 59);

S (millisecondi) – ripetuto tre volte; stampa sempre un valore numerico (da 0 a 999);

Per comparare due date si usano i metodi after, before e equals:

  public static void main(String[] args) throws ParseException {

	        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	        Date date1 = sdf.parse("2009-12-31");
	        Date date2 = sdf.parse("2010-01-31");

	        System.out.println("date1 : " + sdf.format(date1));
	        System.out.println("date2 : " + sdf.format(date2));
	        
	        if (date1.after(date2)) {
	            System.out.println("Date1 is after Date2");
	        }

	        if (date1.before(date2)) {
	            System.out.println("Date1 is before Date2");
	        }

	        if (date1.equals(date2)) {
	            System.out.println("Date1 is equal Date2");
	        }

	    }

Un’altra classe importante per le date, specialmente quando si fanno operazioni aritmetiche,  è java.util.GregorianCalendar, che estende la classe astratta java.util.Calendar.

Per creare un oggetto di classe GregorianCalendar che contenga la data e l’ora corrente, è sufficiente richiamare il costruttore senza parametri.

GregorianCalendar dataAttuale=new GregorianCalendar();

Per settare una data specifica:

GregorianCalendar data1 = new GregorianCalendar(2008, 11, 18);

Per ottenere informazioni sull’ANNO, MESE, GIORNO e ORA si utilizza il metodo get() passandogli come paramentro le costanti statiche definite nella classe (YEAR, MONTH, DAY, …)

                int anno = dataAttuale.get(GregorianCalendar.YEAR);
		int mese = dataAttuale.get(GregorianCalendar.MONTH) + 1; // i mesi partono da 0
		int giorno = dataAttuale.get(GregorianCalendar.DATE);
		int ore = dataAttuale.get(GregorianCalendar.HOUR);
		int minuti = dataAttuale.get(GregorianCalendar.MINUTE);
		int secondi = dataAttuale.get(GregorianCalendar.SECOND);

La classe GregorianCalendar implementa anche dei metodi per effettuare confronti ed operazioni con le date. Di seguito sono riportati alcuni esempi.

Confronto di due date:

		 data1.before(data2); 
		 data1.after(data2);

Somma sottrazione di Date:

		data.add(GregorianCalendar.DATE, +33); // Aggiungo 33 giorni
		data.add(GregorianCalendar.YEAR, -1); // Tolgo 1 anno
		 //Come Add, ma non modifica altri campi come DAY e YEAR
		data.roll(GregorianCalendar.MONTH, +1);

Un altro tipo di date è java.sql.Date, utilizzato per salvare le date  nei database.

Esempio trasformazione da util.date a sql.date

		    java.util.Date d1 = new java.util.Date();
		    Date d = new Date(d1.getTime());

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *