Convertir java.util.Date en chaîne

Convertir java.util.Date en chaîne

1. Vue d'ensemble

Dans ce tutoriel, nous allons montrer comment nous pouvonsconvert Date objects to String objects in Java. Pour ce faire, nous allons travailler avec l'ancien typejava.util.Date ainsi qu'avec la nouvelle APIDate/Time introduite dans Java 8.

Si vous souhaitez apprendre à effectuer la conversion inverse, c'est-à-dire à partir des typesString versDate, vous pouvez consulterthis tutorial here.

Pour plus de détails sur la nouvelle APIDate/Time, veuillez consulterthis related tutorial.

2. Conversion dejava.util.Date enString

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

Dans de tels cas, nous avons plusieurs façons de convertirjava.util.Date enString à notre disposition.

2.1. Préparation de l'objetDate

Déclarons d'abord une représentationString 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 de l'objetDate réel que nous souhaitons convertir. Nous allons utiliser une instanceCalendar pour la 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éfiniTimeZone par défaut surCET pour éviter les problèmes lors de l'utilisation ultérieure de la nouvelle API. Il faut noter quethe Date itself doesn’t have any time zone, but its toString() uses the current default time zone.

Nous utiliserons cette instanceDate dans tous nos exemples ci-dessous.

2.2. Utilisation de la classeSimpleDateFormat

Nous utiliserons la méthodeformat() de la classeSimpleDateFormat 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 à la sortie attendue:

String formattedDate = formatter.format(date);

assertEquals(EXPECTED_STRING_DATE, formattedDate);

2.3. Utilisation de la classe abstraiteDateFormat

Comme nous l’avons vu,SimpleDateFormat est une sous-classe de la classe abstraiteDateFormat. 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 -MEDIUM pour la date etSHORT pour l'heure dans notre cas.

3. Utilisation de la classeFormatter

Un autre moyen simple d'obtenir les mêmesString que dans les exemples précédents consiste à utiliser la classeFormatter.

Bien que ce ne soit peut-être pas la solution la plus lisible,it is a thread-safe one-liner that could be useful, especially in a multi-threaded environment (nous devons garder à l'esprit queSimpleDateFormat 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 surDate/Time Conversions part de la classeFormatter.

4. Conversion à l'aide de Java 8Date/Time API

L'APIDate/Time de Java 8 est bien plus puissante que les classesjava.util.Date etjava.util.Calendar , et nous devrions l'utiliser autant que possible. Voyons comment nous pouvons l'utiliser pour convertir notre objetDate existant enString.

Cette fois, nous utiliserons la classeDateTimeFormatter et sa méthodeformat(), 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 devonsconvert our Date object to an Instant object:

Instant instant = date.toInstant();

Puisque notreString attendu a à la fois des parties de date et d'heure,we also need to convert the Instant object to LocalDateTime:

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

Et enfin, nous pouvons facilement obtenir nosString formatés:

String formattedDate = ldt.format(formatter);

5. Conclusion

Dans cet article, nous avons illustréseveral ways of converting java.util.Date objects to String. Nous avons d'abord montré comment faire cela en utilisant les anciennes classesjava.util.Date etjava.util.Calendar et les classes de formatage de date correspondantes.

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

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