Guide pour DateTimeFormatter

Guide pour DateTimeFormatter

1. Vue d'ensemble

Dans ce didacticiel, nous allons passer en revue la classe Java 8DateTimeFormatter et ses modèles de formatage.. Nous allons également discuter des cas d'utilisation possibles pour cette classe.

Nous pouvons utiliserDateTimeFormatter pour formater uniformément les dates et les heures dans une application avec des modèles prédéfinis ou définis par l'utilisateur.

2. DateTimeFormatter avec des instances prédéfinies

DateTimeFormatter comes with multiple predefined date/time formats qui suivent les normes ISO et RFC. Par exemple, nous pouvons utiliser l'instanceISO_LOCAL_DATE pour analyser une date telle que «2018-03-09»:

DateTimeFormatter.ISO_LOCAL_DATE.format(LocalDate.of(2018, 3, 9));

Pour analyser une date avec un décalage, nous pouvons utiliserISO_OFFSET_DATE pour obtenir une sortie comme "2018-03-09-03: 00":

DateTimeFormatter.ISO_OFFSET_DATE.format(LocalDate.of(2018, 3, 9).atStartOfDay(ZoneId.of("UTC-3")));

Most of the predefined instances of the DateTimeFormatter class are focused on the ISO-8601 standard. ISO-8601 est une norme internationale pour le formatage de la date et de l'heure.

Il existe cependant une instance prédéfinie différente qui analyse la RFC-1123, Requirement for Internet Hosts,published par l'IETF:

DateTimeFormatter.RFC_1123_DATE_TIME.format(LocalDate.of(2018, 3, 9).atStartOfDay(ZoneId.of("UTC-3")));

Cet extrait de code génère "Fri, 9 Mar 2018 00:00:00 -0300".

Parfois, nous devons manipuler la date que nous recevons en tant queString d'un format connu. Nous pouvons utiliser la méthodeparse():

LocalDate.from(DateTimeFormatter.ISO_LOCAL_DATE.parse("2018-03-09")).plusDays(3);

Le résultat de cet extrait de code est une représentationLocalDate pour le 12 mars 2018.

3. DateTimeFormatter avecFormatStyle

Parfois, nous pouvons vouloir imprimer les dates de manière lisible par l’homme.

Dans de tels cas, nous pouvons utiliser les valeursjava.time.format.FormatStyle enum (FULL, LONG, MEDIUM, SHORT) avec nosDateTimeFormatter:

LocalDate anotherSummerDay = LocalDate.of(2016, 8, 23);
System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).format(anotherSummerDay));
System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).format(anotherSummerDay));
System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).format(anotherSummerDay));
System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).format(anotherSummerDay));

La sortie de ces différents styles de formatage de la même date est la suivante:

Tuesday, August 23, 2016
August 23, 2016
Aug 23, 2016
8/23/16

Nous pouvons également utiliser des styles de formatage prédéfinis pour la date et l'heure. Pour utiliserFormatStyle avec le temps, nous devrons utiliser l'instanceZonedDateTime, sinon, unDateTimeException sera lancé:

LocalDate anotherSummerDay = LocalDate.of(2016, 8, 23);
LocalTime anotherTime = LocalTime.of(13, 12, 45);
ZonedDateTime zonedDateTime = ZonedDateTime.of(anotherSummerDay, anotherTime, ZoneId.of("Europe/Helsinki"));
System.out.println(
  DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL)
  .format(zonedDateTime));
System.out.println(
  DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
  .format(zonedDateTime));
System.out.println(
  DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
  .format(zonedDateTime));
System.out.println(
  DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
  .format(zonedDateTime));

Notez que nous avons utilisé cette fois la méthodeofLocalizedDateTime() deDateTimeFormatter.

Et le résultat obtenu est:

Tuesday, August 23, 2016 1:12:45 PM EEST
August 23, 2016 1:12:45 PM EEST
Aug 23, 2016 1:12:45 PM
8/23/16 1:12 PM

Nous pouvons également utiliserFormatStyle pour analyser une date et heureString en la convertissant enZonedDateTime, par exemple.

Nous pouvons ensuite utiliser la valeur analysée pour manipuler la variable date et heure:

ZonedDateTime dateTime = ZonedDateTime.from(
  DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL)
    .parse("Tuesday, August 23, 2016 1:12:45 PM EET"));
System.out.println(dateTime.plusHours(9));

La sortie de cet extrait est «2016-08-23T22: 12: 45 + 03: 00 [Europe / Bucarest]», notez que l'heure est désormais «22:12:45».

4. DateTimeFormatter avec des formats personnalisés

Predefined and built-in formatters and styles can cover a lot of situations. Cependant, nous avons parfois besoin de formater une date et une heure un peu différemment. C'est à ce moment que les modèles de formatage personnalisés entrent en jeu.

4.1. DateTimeFormatter pour la date

Supposons que nous voulions présenter un objetjava.time.LocalDate en utilisant un format européen normal comme le 31.12.2018. Pour ce faire, nous pourrions appeler la méthode d'usineDateTimeFormatter.ofPattern(“dd.MM.yyyy”).

Cela créera une instanceDateTimeFormatter appropriée que nous pouvons utiliser pour formater notre date:

String europeanDatePattern = "dd.MM.yyyy";
DateTimeFormatter europeanDateFormatter = DateTimeFormatter.ofPattern(europeanDatePattern);
System.out.println(europeanDateFormatter.format(LocalDate.of(2016, 7, 31)));

La sortie de cet extrait de code sera «31.07.2016».

Il existe de nombreuses lettres de modèle différentes que nous pouvons utiliser pour créer un format de date adapté à nos besoins:

  Symbol  Meaning                     Presentation      Examples
  ------  -------                     ------------      -------
   u       year                        year              2004; 04
   y       year-of-era                 year              2004; 04
   M/L     month-of-year               number/text       7; 07; Jul; July; J
   d       day-of-month                number            10

Ceci est un extrait de la classeofficial Java documentation àDateTimeFormatter.

The number of letters in the pattern format is significant.

Si nous utilisons un modèle à deux lettres pour le mois, nous aurons une représentation mensuelle à deux chiffres. Si le nombre de mois est inférieur à 10, il sera complété par un zéro. Lorsque nous n'avons pas besoin du remplissage mentionné avec des zéros, nous pouvons utiliser un modèle à une lettre «M», qui affichera janvier comme «1».

Si nous utilisons un modèle de quatre lettres pour le mois, «MMMM», nous obtiendrons une représentation «sous forme complète». Dans notre exemple, c'est "juillet". Un modèle de 5 lettres, «MMMMM», obligera le formateur à utiliser la «forme étroite». Dans notre cas, “J” serait utilisé.

De même, un modèle de formatage personnalisé peut également être utilisé pour analyser une chaîne contenant une date:

DateTimeFormatter europeanDateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
System.out.println(LocalDate.from(europeanDateFormatter.parse("15.08.2014")).isLeapYear());

Cet extrait de code vérifie si la date "15.08.2014" fait partie d'une année bissextile, et ce n'est pas le cas.

4.2. DateTimeFormatter pour le temps

Il existe également des lettres de modèle pouvant être utilisées pour les modèles de temps:

  Symbol  Meaning                     Presentation      Examples
  ------  -------                     ------------      -------
   H       hour-of-day (0-23)          number            0
   m       minute-of-hour              number            30
   s       second-of-minute            number            55
   S       fraction-of-second          fraction          978
   n       nano-of-second              number            987654321

Il est assez simple d’utiliserDateTimeFormatter pour formater une instancejava.time.LocalTime. Supposons que nous voulions afficher l'heure (heures, minutes et secondes) délimitée par deux points:

String timeColonPattern = "HH:mm:ss";
DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern(timeColonPattern);
LocalTime colonTime = LocalTime.of(17, 35, 50);
System.out.println(timeColonFormatter.format(colonTime));

Cela générera la sortie «17:35:50».

Si nous voulons ajouter des millisecondes à la sortie, nous devons ajouter "SSS" au modèle:

String timeColonPattern = "HH:mm:ss SSS";
DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern(timeColonPattern);
LocalTime colonTime = LocalTime.of(17, 35, 50).plus(329, ChronoUnit.MILLIS);
System.out.println(timeColonFormatter.format(colonTime));

Ce qui donne la sortie «17:35:50 329».

Notez que «HH» est un modèle d’heure qui génère le résultat de 0 à 23. Lorsque nous voulons montrer AM / PM, nous devrions utiliser “hh” minuscule pendant des heures et ajouter un motif “a”:

String timeColonPattern = "hh:mm:ss a";
DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern(timeColonPattern);
LocalTime colonTime = LocalTime.of(17, 35, 50);
System.out.println(timeColonFormatter.format(colonTime));

La sortie générée est «05:35:50 PM».

Nous pouvons vouloir analyser le tempsString avec notre formateur personnalisé et vérifier s'il est avant midi:

DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("hh:mm:ss a");
System.out.println(LocalTime.from(timeFormatter.parse("12:25:30 AM")).isBefore(LocalTime.NOON));

La sortie de ce dernier extrait montre que l'heure indiquée est en réalité avant midi.

4.3. DateTimeFormatter pour les fuseaux horaires

Often we want to see a time zone of some specific date-time variable. Si nous utilisons la date-heure basée à New York (UTC -4), nous pouvons utiliser la lettre-modèle «z» pour le nom du fuseau horaire:

String newYorkDateTimePattern = "dd.MM.yyyy HH:mm z";
DateTimeFormatter newYorkDateFormatter = DateTimeFormatter.ofPattern(newYorkDateTimePattern);
LocalDateTime summerDay = LocalDateTime.of(2016, 7, 31, 14, 15);
System.out.println(newYorkDateFormatter.format(ZonedDateTime.of(summerDay, ZoneId.of("UTC-4"))));

Cela générera la sortie «31.07.2016 14:15 UTC-04: 00».

Nous pouvons analyser les chaînes de date et d'heure avec les fuseaux horaires, comme nous l'avons fait précédemment:

DateTimeFormatter zonedFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm z");
System.out.println(ZonedDateTime.from(zonedFormatter.parse("31.07.2016 14:15 GMT+02:00")).getOffset().getTotalSeconds());

La sortie de ce code est de "7200" secondes, soit 2 heures, comme prévu.

Nous devons nous assurer que nous fournissons une date / heure correcteString à la méthodeparse(). Si nous passons «31.07.2016 14:15», sans fuseau horaire, auxzonedFormatter du dernier extrait de code, nous obtiendrons unDateTimeParseException.

5. Conclusion

In this tutorial, we’ve discussed how to use the DateTimeFormatter class for format dates and times. Nous avons utilisé des exemples de modèles réels qui surviennent souvent lorsque nous travaillons avec des instances date-heure.

Nous pouvons en savoir plus sur l'API Java 8Date/Time dansprevious tutorials. Comme toujours, le code source utilisé dans le didacticiel est disponibleover on GitHub.