Converti java.util.Date in String

1. Panoramica

In questo tutorial, mostreremo come convertire gli oggetti Date in oggetti String in Java . Per fare ciò, lavoreremo con il vecchio tipo java.util.Date e con la nuova API Data / Ora introdotta in Java 8.

Se desideri imparare come eseguire la conversione opposta, ovvero dai tipi String a Date , puoi dare un'occhiata a questo tutorial qui.

Per ulteriori dettagli sulla nuova API Data / Ora , vedere questo tutorial correlato.

2. Conversione di java.util.Date in String

Sebbene non dovremmo usare java.util.Date se stiamo lavorando con Java 8, a volte non abbiamo scelta (ad esempio, stiamo ricevendo l' oggetto Date da una libreria che non è nel nostro controllo).

In questi casi, abbiamo diversi modi per convertire java.util.Date in String a nostra disposizione.

2.1. Preparazione dell'oggetto data

Per prima cosa dichiariamo una rappresentazione String prevista della nostra data e definiamo uno schema del formato di data desiderato:

private static final String EXPECTED_STRING_DATE = "Aug 1, 2018 12:00 PM"; private static final String DATE_FORMAT = "MMM d, yyyy HH:mm a";

Ora abbiamo bisogno dell'oggetto Date effettivo che vorremmo convertire. Useremo un'istanza di Calendar per crearlo:

TimeZone.setDefault(TimeZone.getTimeZone("CET")); Calendar calendar = Calendar.getInstance(); calendar.set(2018, Calendar.AUGUST, 1, 12, 0); Date date = calendar.getTime();

Abbiamo impostato il fuso orario predefinito su CET per evitare problemi quando si lavora con la nuova API in un secondo momento. Dobbiamo notare che la data stessa non ha alcun fuso orario, ma la sua toString () utilizza il fuso orario predefinito corrente .

Useremo questa istanza di Date in tutti i nostri esempi di seguito.

2.2. Utilizzo della classe SimpleDateFormat

In questo esempio, utilizzeremo il metodo format () della classe SimpleDateFormat . Creiamo un'istanza di esso utilizzando il nostro formato di data:

DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);

Dopodiché, possiamo formattare la nostra data e confrontarla con l'output previsto:

String formattedDate = formatter.format(date); assertEquals(EXPECTED_STRING_DATE, formattedDate);

2.3. Utilizzo della classe DateFormat astratta

Come abbiamo potuto vedere, SimpleDateFormat è una sottoclasse della classe astratta DateFormat . Questa classe fornisce vari metodi per la formattazione di data e ora.

Lo useremo per ottenere lo stesso output di sopra:

String formattedDate = DateFormat .getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT) .format(date);

Con questo approccio, stiamo passando modelli di stile: MEDIO per la data e BREVE per il tempo nel nostro caso.

3. Utilizzo della classe Formatter

Un altro modo semplice per ottenere la stessa stringa degli esempi precedenti è utilizzare la classe Formatter .

Anche se questa potrebbe non essere la soluzione più leggibile, è un one-liner thread-safe che potrebbe essere utile, specialmente in un ambiente multi-thread (dobbiamo tenere presente che SimpleDateFormat non è thread-safe):

String formattedDate = String.format("%1$tb %1$te, %1$tY %1$tI:%1$tM %1$Tp", date);

Abbiamo usato 1 $ per indicare che passeremo un solo argomento da utilizzare con ogni flag. Una spiegazione dettagliata dei flag può essere trovata nella parte Conversioni data / ora della classe Formatter .

4. Conversione utilizzando Java 8 Date / Time API

L' API Data / Ora di Java 8 è molto più potente delle classi java.util.Date e java.util.Calendar e dovremmo usarla ogni volta che è possibile. Vediamo come possiamo utilizzarlo per convertire il nostro oggetto Date esistente in String .

Questa volta useremo la classe DateTimeFormatter e il suo metodo format () , così come lo stesso modello di data, dichiarato nella Sezione 2.1:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT);

Per utilizzare la nuova API, dobbiamo convertire il nostro oggetto Date in un oggetto Instant :

Instant instant = date.toInstant();

Poiché la nostra stringa prevista ha parti di data e ora, dobbiamo anche convertire l' oggetto Instant in LocalDateTime :

LocalDateTime ldt = instant .atZone(ZoneId.of("CET")) .toLocalDateTime();

E infine, possiamo facilmente ottenere la nostra stringa formattata :

String formattedDate = ldt.format(formatter);

5. conclusione

In questo articolo, abbiamo illustrato diversi modi per convertire gli oggetti java.util.Date in String . Per prima cosa abbiamo mostrato come farlo utilizzando le classi java.util.Date e java.util.Calendar precedenti e le classi di formattazione della data corrispondenti.

Quindi abbiamo utilizzato la classe Formatter e, infine, l'API Data / Ora Java 8.

Come sempre, il codice sorgente completo può essere trovato su GitHub.