Converti stringa in data in Java

1. Panoramica

In questo tutorial, esploreremo diversi modi per convertire gli oggetti String in oggetti Date . Inizieremo con la nuova API Date Time - java.time che è stata introdotta in Java 8 prima di esaminare il vecchio tipo di dati java.util.Date utilizzato anche per rappresentare le date.

Per finire, esamineremo anche alcune librerie esterne per la conversione utilizzando Joda-Time e la classe Apache Commons Lang DateUtils .

2. Conversione della stringa in LocalDate o LocalDateTime

LocalDate e LocalDateTime sono oggetti data-ora non modificabili che rappresentano una data e, successivamente, una data e un'ora. Per impostazione predefinita, le date Java sono nel formato ISO-8601, quindi se abbiamo una stringa che rappresenta una data e un'ora in questo formato, possiamo utilizzare direttamente l' API parse () di queste classi .

Ecco qualche dettaglio in più su questa nuova API.

2.1. Utilizzando l' API Parse

L 'API Date-Time fornisce metodi parse () per analizzare una stringa che contiene informazioni su data e ora. Per convertire gli oggetti String in oggetti LocalDate e LocalDateTime , la String deve rappresentare una data o un'ora valida secondo ISO_LOCAL_DATE o ISO_LOCAL_DATE_TIME.

In caso contrario, verrà generata un'eccezione DateTimeParseException in fase di esecuzione.

Nel nostro primo esempio, convertiamo una stringa in java.time . LocalDate :

LocalDate date = LocalDate.parse("2018-05-05");

Un approccio simile al precedente può essere utilizzato per convertire una stringa in java.time . LocalDateTime :

LocalDateTime dateTime = LocalDateTime.parse("2018-05-05T11:50:55");

È importante notare che entrambi gli oggetti LocalDate e LocalDateTime sono indipendenti dal fuso orario. Tuttavia, quando dobbiamo gestire la data e l'ora specifiche del fuso orario, possiamo utilizzare il metodo di analisi ZonedDateTime direttamente per ottenere una data e l'ora specifica del fuso orario:

ZonedDateTime zonedDateTime = ZonedDateTime.parse("2015-05-05T10:15:30+01:00[Europe/Paris]");

Ora diamo un'occhiata a come convertiamo le stringhe con un formato personalizzato.

2.2. Utilizzo dell'API di analisi con un formattatore personalizzato

La conversione di una stringa con un formato di data personalizzato in un oggetto Date è un'operazione diffusa in Java.

A tale scopo, utilizzeremo la classe DateTimeFormatter che fornisce numerosi formattatori predefiniti e ci consente di definire un formattatore.

Cominciamo con un esempio di utilizzo di uno dei formattatori predefiniti di DateTimeFormatter :

String dateInString = "19590709"; LocalDate date = LocalDate.parse(dateInString, DateTimeFormatter.BASIC_ISO_DATE);

Nel prossimo esempio creiamo un formattatore che applica un formato di "EEE, MMM d yyyy". Questo formato specifica tre caratteri per il nome completo del giorno della settimana, una cifra per rappresentare il giorno del mese, tre caratteri per rappresentare il mese e quattro cifre per rappresentare l'anno.

Questo formattatore riconosce stringhe come " Fri, 3 Jan 2003" o "Wed, 23 Mar 1994 ":

String dateInString = "Mon, 05 May 1980"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, d MMM yyyy", Locale.ENGLISH); LocalDate dateTime = LocalDate.parse(dateInString, formatter);

2.3. Modelli comuni di data e ora

Diamo un'occhiata ad alcuni modelli di data e ora comuni:

  • y - Anno (1996; 96)
  • M - Mese dell'anno (luglio; luglio; 07)
  • d - Giorno nel mese (1-31)
  • E - Nome del giorno nella settimana (venerdì, domenica)
  • a - Indicatore am / pm (AM, PM)
  • H - Ora nel giorno (0-23)
  • h - Ora am / pm (1-12)
  • m - Minuto in ora (0-60)
  • s - Secondo in minuto (0-60)

Per un elenco completo dei simboli che possiamo utilizzare per specificare un modello per l'analisi, fare clic qui.

Se dobbiamo convertire le date java.time nel vecchio oggetto java.util.Date , leggi questo articolo per maggiori dettagli.

3. Conversione di String in java.util.Date

Prima di Java 8, il meccanismo di data e ora Java veniva fornito dalle vecchie API delle classi java.util.Date , java.util.Calendar e java.util.TimeZone con cui a volte dobbiamo ancora lavorare.

Vediamo come convertire una String in un oggetto java.util.Date :

SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH); String dateInString = "7-Jun-2013"; Date date = formatter.parse(dateInString);

Nell'esempio precedente, dobbiamo prima costruire un oggetto SimpleDateFormat passando il modello che descrive il formato di data e ora.

Successivamente, dobbiamo invocare il metodo parse () passando la stringa della data . Se l' argomento String passato non è nello stesso formato del pattern, verrà generata un'eccezione ParseException .

3.1. Aggiunta di informazioni sul fuso orario a java.util.Date

È importante notare che java.util.Date non ha il concetto di fuso orario e rappresenta solo il numero di secondi trascorsi dall'ora dell'epoca Unix - 1970-01-01T00: 00: 00Z.

Tuttavia, quando stampiamo direttamente l'oggetto Date , verrà sempre stampato con il fuso orario di sistema predefinito di Java.

In questo esempio finale vedremo come formattare una data, aggiungendo le informazioni sul fuso orario:

SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a", Locale.ENGLISH); formatter.setTimeZone(TimeZone.getTimeZone("America/New_York")); String dateInString = "22-01-2015 10:15:55 AM"; Date date = formatter.parse(dateInString); String formattedDateString = formatter.format(date);

Possiamo anche modificare il fuso orario JVM a livello di codice, ma questo non è consigliato:

TimeZone.setDefault(TimeZone.getTimeZone("GMT"));

4. Biblioteche esterne

Ora che abbiamo una buona conoscenza di come convertire gli oggetti String in oggetti Date utilizzando le nuove e vecchie API offerte dal core Java, diamo un'occhiata ad alcune librerie esterne.

4.1. Libreria Joda-Time

An alternative to the core Java Date and Time library is Joda-Time. Although the authors now recommend users to migrate to java.time (JSR-310) if this isn't possible then the Joda-Time library provides an excellent alternative for working with Date and Time. This library provides pretty much all capabilities supported in the Java 8 Date Time project.

The artifact can be found on Maven Central:

 joda-time joda-time 2.10 

Here’s a quick example working with the standard DateTime:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"); String dateInString = "07/06/2013 10:11:59"; DateTime dateTime = DateTime.parse(dateInString, formatter);

Let's also see an example of explicitly setting a time zone:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"); String dateInString = "07/06/2013 10:11:59"; DateTime dateTime = DateTime.parse(dateInString, formatter); DateTime dateTimeWithZone = dateTime.withZone(DateTimeZone.forID("Asia/Kolkata"));

4.2. Apache Commons Lang – DateUtils

La classe DateUtils fornisce molte utilità utili che semplificano il lavoro con gli oggetti Calendar e Date legacy .

L'artefatto commons-lang3 è disponibile da Maven Central:

 org.apache.commons commons-lang3 3.7 

Convertiamo una stringa di data utilizzando un array di modelli di data in un java.util.Date :

String dateInString = "07/06-2013"; Date date = DateUtils.parseDate(dateInString, new String[] { "yyyy-MM-dd HH:mm:ss", "dd/MM-yyyy" });

5. conclusione

In questo articolo, abbiamo illustrato diversi modi per convertire le stringhe in diversi tipi di oggetti Date (con e senza tempo), sia in Java semplice che utilizzando librerie esterne.

Il codice sorgente completo dell'articolo è disponibile su GitHub.