Convertir java.util.Date en chaîne

1. Vue d'ensemble

Dans ce didacticiel, nous montrerons comment convertir des objets Date en objets String en Java . Pour ce faire, nous travaillerons avec l'ancien type java.util.Date ainsi qu'avec la nouvelle API Date / Heure introduite dans Java 8.

Si vous souhaitez apprendre à effectuer la conversion opposée, c'est-à-dire des types String à Date , vous pouvez consulter ce tutoriel ici.

Pour plus de détails sur la nouvelle API Date / Heure , veuillez consulter ce didacticiel connexe.

2. Conversion de java.util.Date en chaîne

Bien que nous ne devions pas utiliser java.util.Date si nous travaillons avec Java 8, nous n'avons parfois pas le choix (par exemple, nous recevons l' objet Date d'une bibliothèque qui n'est pas sous notre contrôle).

Dans de tels cas, nous avons plusieurs façons de convertir java.util.Date en String à notre disposition.

2.1. Préparation de l' objet Date

Déclarons d'abord une représentation String attendue de notre date et définissons un modèle de format de date souhaité:

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

Nous avons maintenant besoin d'un objet Date réel que nous aimerions convertir. Nous utiliserons une instance de calendrier pour le créer:

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

Nous avons défini TimeZone par défaut sur CET pour éviter les problèmes lors de l'utilisation de la nouvelle API ultérieurement. Nous devons noter que la Date elle-même n'a pas de fuseau horaire, mais son toString () utilise le fuseau horaire par défaut actuel .

Nous utiliserons cette instance de Date dans tous nos exemples ci-dessous.

2.2. Utilisation de la classe SimpleDateFormat

Nous utiliserons la méthode format () de la classe SimpleDateFormat dans cet exemple. Créons-en une instance en utilisant notre format de date:

DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);

Après cela, nous pouvons formater notre date et la comparer avec la sortie attendue:

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

2.3. Utilisation de la classe abstraite DateFormat

Comme nous l'avons vu, SimpleDateFormat est une sous-classe de la classe abstraite DateFormat . Cette classe fournit diverses méthodes pour le formatage de la date et de l'heure.

Nous l'utiliserons pour obtenir le même résultat que ci-dessus:

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

Avec cette approche, nous passons des modèles de style - MOYEN pour la date et COURT pour l'heure dans notre cas.

3. Utilisation de la classe Formatter

Un autre moyen simple d'obtenir la même chaîne que dans les exemples précédents consiste à utiliser la classe Formatter .

Bien que ce ne soit peut-être pas la solution la plus lisible, il s'agit d'un one-liner thread-safe qui pourrait être utile, en particulier dans un environnement multi-thread (nous devons garder à l'esprit que SimpleDateFormat n'est pas thread-safe):

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

Nous avons utilisé 1 $ pour indiquer que nous ne passerons qu'un seul argument à utiliser avec chaque indicateur. Une explication détaillée des indicateurs peut être trouvée dans la partie Conversions date / heure de la classe Formatter .

4. Conversion à l'aide de l'API de date / heure Java 8

L' API Date / Heure de Java 8 est bien plus puissante que les classes java.util.Date et java.util.Calendar , et nous devrions l'utiliser autant que possible. Voyons comment nous pouvons l'utiliser pour convertir notre objet Date existant en String .

Cette fois, nous utiliserons la classe DateTimeFormatter et sa méthode format () , ainsi que le même modèle de date, déclaré dans la section 2.1:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT);

Pour utiliser la nouvelle API, nous devons convertir notre objet Date en objet Instant :

Instant instant = date.toInstant();

Étant donné que notre chaîne attendue comporte à la fois des parties de date et d'heure, nous devons également convertir l' objet Instant en LocalDateTime :

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

Et enfin, nous pouvons facilement obtenir notre String formaté :

String formattedDate = ldt.format(formatter);

5. Conclusion

Dans cet article, nous avons illustré plusieurs façons de convertir des objets java.util.Date en String . Nous avons d'abord montré comment faire cela en utilisant les anciennes classes java.util.Date et java.util.Calendar et les classes de mise en forme de date correspondantes.

Ensuite, nous avons utilisé la classe Formatter et, enfin, l'API Java 8 Date / Time.

Comme toujours, le code source complet peut être trouvé sur GitHub.