Programmando in Java è possibile fruire di diversi oggetti per la gestione delle date; personalmente la soluzione che preferisco consiste nell’utilizzare la classe SimpleDateFormat (java.text.SimpleDateFormat) che consente di definire dei pattern personalizzati per l’output.
SimpleDateFormat è una classe concepita appositamente per la formattazione e il parsing delle date in una modalità locale-sensitive, cioè adeguata al formato temporale in uso nell’area geografica del sistema. SimpleDateFormat effettua in sostanza delle operazioni di normalizzazione delle date e prevede la formattazione da data a testo e il parsing da testo a data.
Vedimo subito un esempio che ci servirà a comprendere meglio le potenzialità della classe SimpleDateFormat:
package date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class FormattaLaData {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat(); // creo l'oggetto
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);
// output atteso: 20-02-14-23.45.23 100
sdf.applyPattern("dd-MM-yy-HH.mm.ss SSS");
System.out.println(dataStr);
// settiamo la data in inglese: 20 February 2014
Locale.setDefault(Locale.ENGLISH);
sdf = new SimpleDateFormat("dd MMMM yyyy"); // devo dichiarare un nuovo oggetto per applicare i settaggi di localizzazione
System.out.println(dataStr);
// e in italiano: 20 Febbraio 2014
Locale.setDefault(Locale.ITALIAN);
sdf = new SimpleDateFormat("dd MMMM yyyy");
System.out.println(dataStr);
}
}
Come potete vedere l’utilizzo di questa classe è piuttosto semplice come piuttosto intuitivo è la definizione dei pattern per la formattazione dell’output.
Questo può essere definito al momento della creazione dell’oggetto:
SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy");
Oppure in un momento successivo:
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.applyPattern("dd MMMM yyyy");
Si noti che le lettere per la definizione dei pattern vengono normalmente 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.
Un esempio pratico
L’esempio seguente mostra come sia possibile inizializzare una data tramite il metodo Date()
, specificare il formato desiderato per la data (nel nostro caso "giorno/mese/anno"), creare un oggetto di SimpleDateFormat
e formattarlo secondo il modello definito.
import java.text.SimpleDateFormat;
import java.util.Date;
public class FormattaData{
public static void main(String args[]){
Date data = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
System.out.println("Oggi è il " + sdf.format(data) );
}
}
Chiaramente sarà possibile utilizzare qualsiasi formato possa poi essere interpretato da un’applicazione come una data reale. Nel caso dell’esempio proposto in precedenza la procedura verrà effettuata a carico della data corrente, ma, con qualche modifica, sarà anche possibile specificare una data precisa da parsare:
import java.text.SimpleDateFormat;
import java.util.Date;
public class FormattaData{
public static void main(String args[]){
String data = "18/05/2014";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
System.out.println("Oggi è il " + sdf.parse(data) );
}
}
Formattazione delle date
Segue una tabella con le lettere che abbiamo utilizzato 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);
N.B. per i valori numerici (come ore, minuti e secondi) è consigliabile ripetere la lettere per il numero di cifre attese; tuttavia è bene ricordare che in caso di una ripetizione inferiore alle cifre attese l’interprete Java correggerà in automatico.
Oltre a queste lettere ce ne sono altre che vengono utilizzate meno di frequente. Segue la tabella completa delle lettere disponibili per la formattazione di date e orari:
E’ bene ricordare che tutte le lettere "speciali" verranno formattatate secondo quanto previsto nella tabella di corrispondenza; per inserire del testo non interpretato come pattern è sufficiente metterlo tra singoli apici.