back to top

SimpleDateFormat: formattare una data in Java

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:

SimpleDateFormat

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.

Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).

Leggi anche...

Java: cos’è e a cosa serve l’operatore modulo (%)

In Java, l'operatore modulo è rappresentato dal simbolo "%"...

Arrotondare un numero con Java

Quando si lavora con i numeri all'interno di un...

Java: cos’è l’errore NullPointerException e come risolverlo

RuntimeException รจ una superclasse di Java che ricomprende tutte...

Stringhe in Java

La gestione delle stringhe assume un ruolo fondamentale in...

Leggere un file di testo in java

In java ci sono diverse modalità per leggere dati...

Il costrutto foreach in java

Il foreach è un particolare costrutto (disponibile a partire...
Pubblicitร