Convertir une chaîne en date en Java

1. Vue d'ensemble

Dans ce tutoriel, nous allons explorer plusieurs façons de convertir chaîne objets en date des objets . Nous allons commencer par la nouvelle API Date Time - java.time qui a été introduite dans Java 8 avant d'examiner l'ancien type de données java.util.Date également utilisé pour représenter les dates.

Pour finir, nous examinerons également certaines bibliothèques externes pour la conversion à l'aide de Joda-Time et de la classe Apache Commons Lang DateUtils .

2. Conversion de la chaîne en LocalDate ou LocalDateTime

LocalDate et LocalDateTime sont des objets date-heure immuables qui représentent une date et, plus tard, une date et une heure. Par défaut, les dates Java sont au format ISO-8601, donc si nous avons une chaîne qui représente une date et une heure dans ce format, nous pouvons utiliser directement l'API parse () de ces classes .

Voici un peu plus de détails sur cette nouvelle API.

2.1. Utilisation de l' API Parse

L'API Date-Heure fournit des méthodes parse () pour analyser une chaîne contenant des informations de date et d'heure. Pour convertir des objets String en objets LocalDate et LocalDateTime , la chaîne doit représenter une date ou une heure valide selon ISO_LOCAL_DATE ou ISO_LOCAL_DATE_TIME.

Sinon, une DateTimeParseException sera levée lors de l'exécution.

Dans notre premier exemple, convertissons une chaîne en java.time . LocalDate :

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

Une approche similaire à celle ci-dessus peut être utilisée pour convertir une chaîne en java.time . LocalDateTime :

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

Il est important de noter que les objets LocalDate et LocalDateTime sont indépendants du fuseau horaire. Cependant, lorsque nous devons gérer la date et l'heure spécifiques au fuseau horaire, nous pouvons utiliser la méthode d' analyse ZonedDateTime directement pour obtenir une heure de date spécifique au fuseau horaire:

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

Voyons maintenant comment nous convertissons des chaînes avec un format personnalisé.

2.2. Utilisation de l' API Parse avec un formateur personnalisé

La conversion d'une chaîne avec un format de date personnalisé en un objet Date est une opération répandue en Java.

Pour cela, nous utiliserons la classe DateTimeFormatter qui fournit de nombreux formateurs prédéfinis et nous permet de définir un formateur.

Commençons par un exemple d'utilisation de l'un des formateurs prédéfinis de DateTimeFormatter :

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

Dans l'exemple suivant, créons un formateur qui applique le format «EEE, MMM jyyyy». Ce format spécifie trois caractères pour le nom du jour complet de la semaine, un chiffre pour représenter le jour du mois, trois caractères pour représenter le mois et quatre chiffres pour représenter l'année.

Ce formateur reconnaît des chaînes telles que " Ven, 3 Jan 2003" ou "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. Modèles de date et d'heure courants

Regardons quelques modèles de date et d'heure courants:

  • y - Année (1996; 96)
  • M - Mois dans l'année (juillet; juillet; 07)
  • d - Jour dans le mois (1-31)
  • E - Nom du jour dans la semaine (vendredi, dimanche)
  • a - Marqueur am / pm (AM, PM)
  • H - Heure dans la journée (0-23)
  • h - Heure en am / pm (1-12)
  • m - Minute en heure (0-60)
  • s - Seconde en minute (0-60)

Pour une liste complète des symboles que nous pouvons utiliser pour spécifier un modèle d'analyse, cliquez ici.

Si nous devons convertir les dates java.time dans l'ancien objet java.util.Date , lisez cet article pour plus de détails.

3. Conversion de String en java.util.Date

Avant Java 8, le mécanisme de date et d'heure Java était fourni par les anciennes API des classes java.util.Date , java.util.Calendar et java.util.TimeZone avec lesquelles nous devons parfois encore travailler.

Let's see how to convert a String into a java.util.Date object:

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

In the above example, we first need to construct a SimpleDateFormat object by passing the pattern describing the date and time format.

Next, we need to invoke the parse() method passing the date String. If the String argument passed is not in the same format as the pattern then a ParseException will be thrown.

3.1. Adding Time Zone Information to java.util.Date

It's important to note that the java.util.Date has no concept of time zone, and only represents the number of seconds passed since the Unix epoch time – 1970-01-01T00:00:00Z.

But, when we print the Date object directly, it will always be printed with the Java default system time zone.

In this final example we'll look at how to format a date, adding time zone information:

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);

We can also change the JVM time zone programmatically, but this isn't recommended:

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

4. External Libraries

Now that we have a good understanding of how to convert String objects to Date objects using the new and old APIs offered by core Java let's take a look at some external libraries.

4.1. Joda-Time Library

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 fournit de nombreux utilitaires utiles facilitant le travail avec les anciens objets Calendar et Date .

L'artefact commons-lang3 est disponible depuis Maven Central:

 org.apache.commons commons-lang3 3.7 

Convertissons une chaîne de date à l' aide d'un tableau de modèles de date en 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. Conclusion

Dans cet article, nous avons illustré plusieurs façons de convertir des chaînes en différents types d' objets Date (avec et sans heure), à ​​la fois en Java simple et en utilisant des bibliothèques externes.

Le code source complet de l'article est disponible à l'adresse over sur GitHub.