2. antislashn.org Java 8 - Date Time API 2 / 15
Présentation
● Java 8 améliore nettement la manipulation des dates
● Date-Time API - JSR 310
– issu du projet Joda-Time
● package java.time
● cf. http://docs.oracle.com/javase/tutorial/datetime/iso/index.html
● possibilités
– analyse et formatage de dates
– calcul sur les dates
– gestion des dates au format ISO
3. antislashn.org Java 8 - Date Time API 3 / 15
Présentation
● Thread safety
● les classes Date et Calendar ne sont pas thread safe
● les objets de l'API Date-Time sont immuables
● API simple à comprendre
● les classes Date et Calendar sont complexes à utiliser
pour effectuer des calculs sur les dates
● cette nouvelle API est constituée de date, d'heure, de
durée et de période.
● gestion des fuseaux horaires
4. antislashn.org Java 8 - Date Time API 4 / 15
Présentation
● Classes de base
● LocalDate
● LocalTime
● LocalDateTime
● comme le préfixe l'indique, elles représentent un jour ou
une heure depuis le contexte d'exécution
● ces classes sont habituellement utilisées lorsque le fuseau
horaire n'a pas besoin d'être précisé
5. antislashn.org Java 8 - Date Time API 5 / 15
LocalDate
● Représente une date au format yyy-MM-dd
● norme ISO-8601
● nombreuses possibilités pour créer une date
● méthodes statiques
– now(), of(), ofEpochDay(),ofYearDay(),parse()
LocalDate date1 = LocalDate.now();
LocalDate date2 = LocalDate.of(2019, 1, 1);
LocalDate date3 = LocalDate.parse("2019-01-01");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyy");
LocalDate date4 = LocalDate.parse("01/01/2019",formatter);
6. antislashn.org Java 8 - Date Time API 6 / 15
LocalDate
● Plusieurs méthodes pour exécuter des calculs sur les
dates
● plus(), plusDay(), plusMonth(),
plusWeek(),plusYear()
● minus(), minusDay(), minusMonth(), minusWeek(),
minusYear()
● Des comparaisons
● isLeapYear(), isAfter(), isBefore()
LocalDate date5 = date2.plusDays(1);
LocalDate date6 = date2.plusMonths(2);
LocalDate date7 = date2.minus(3, ChronoUnit.DAYS);
7. antislashn.org Java 8 - Date Time API 7 / 15
LocaleDate
● Méthodes utilitaires
● retournant le jour, le mois, l'année, l'ère
– get(TemporalField)
– getDayOfWeek(), getDayOfMonth(), getDayOfYear()
– getMonth(), getMonthValue()
– getYear()
– getEra()
System.out.println(date2.getDayOfMonth());
System.out.println(date2.getMonth().toString());
8. antislashn.org Java 8 - Date Time API 8 / 15
LocaleTime
● Représente une heure
● format hh:mm:ss
● norme ISO-8601
● fonctionnement équivalent à LocaleDate
● méthodes statiques de création
● méthodes de calcul et de comparaison
9. antislashn.org Java 8 - Date Time API 9 / 15
LocalDateTime
● Représente une combinaison de le date et de l'heure
● format yyy-MM-ddThh:mm:ss
● norme ISO-8601
● fonctionnement équivalent à LocaleDate
● méthodes statiques de création
● méthodes de calcul et de comparaison
10. antislashn.org Java 8 - Date Time API 10 / 15
Autres classes
● Period
● classe utilitaire permettant de manipuler plus simplement
les dates
● il est aisé de récupérer une période entre deux dates
LocalDate date7 = date2.minus(Period.ofDays(6));
long nbJours = ChronoUnit.DAYS.between(date2, date7);
11. antislashn.org Java 8 - Date Time API 11 / 15
Autres classes
● Duration
● classe utilitaire permettant de manipuler plus simplement
les heures
● il est aisé de récupérer une durée entre deux heures
LocalTime initialTime = LocalTime.of(6, 30, 0);
LocalTime finalTime = initialTime.plus(Duration.ofSeconds(30));
long nbSecondes = Duration.between(finalTime, initialTime).getSeconds();
12. antislashn.org Java 8 - Date Time API 12 / 15
Compatibilité
● Java 8 ajoute la méthode toInstant() aux classes
Date et Calendar pour faciliter le passage à l'API
Date Time
LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
LocalDateTime.ofInstant(calendar.toInstant(), ZoneId.systemDefault());
13. antislashn.org Java 8 - Date Time API 13 / 15
Formatage
● La classe DateTimeFormatter permet de créer de
nombreuses options de formatage
● localisation
● formats personnalisés
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyy");
LocalDate date4 = LocalDate.parse("01/01/2019",formatter);
14. antislashn.org Java 8 - Date Time API 14 / 15
Formatage
● Attention
● utiliser le bon formatter en fonction de la classe
– ofLocalizedDate()
– ofLocalisedTime()
– ofLocalizedDateTime()
● l'utilisation de FormatStyle.FULL ou
FormatStyle.LONG peut produire une exception
– c'est deux formats peuvent avoir besoin de la partie Time
● cf. https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html
15. antislashn.org Java 8 - Date Time API 15 / 15
Ressources
● https://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html
● https://www.baeldung.com/java-8-date-time-intro
● https://blog.ippon.fr/2014/03/19/java-8-gestion-du-temps/
● https://stackoverrun.com/fr/q/12685455