Le package java.time, introduit avec Java 8, contient plusieurs classes pour travailler avec les dates et les heures.
LocalDateLa classe java.time.LocalDate représente une date sans fuseau horaire dans le système de calendrier ISO-8601, comme 2007-12-03 :
LocalDate date = LocalDate.of(2007, 12, 3);
On peut comparer des dates entre elles :
LocalDate date1 = LocalDate.of(2007, 12, 3);
LocalDate date2 = LocalDate.of(2007, 12, 4);
date1.isBefore(date2);
// => true
date1.isAfter(date2);
// => false
Une instance de LocalDate possède des getters pour en extraire les différentes parties :
LocalDate date = LocalDate.of(2007, 12, 3);
date.getYear();
// => 2007
date.getMonthValue();
// => 12
date.getDayOfMonth();
// => 3
Une instance de LocalDate possède des méthodes pour lui ajouter des unités de temps.
Ces méthodes renvoient une nouvelle instance de LocalDate et ne modifient pas l'instance existante, car la classe LocalDate est immuable.
LocalDate date = LocalDate.of(2007, 12, 3);
date.plusDays(3);
// => 2007-12-06
date.plusMonths(1);
// => 2008-01-03
date.plusYears(1);
// => 2008-12-03
LocalDateTimeLa classe java.time.LocalDateTime représente une date et une heure sans fuseau horaire dans le système de calendrier ISO-8601, comme 2007-12-03T10:15:30 :
LocalDateTime datetime = LocalDateTime.of(2007, 12, 3, 10, 15, 30);
datetime.getYear();
// => 2007
datetime.getMonthValue();
// => 12
datetime.getDayOfMonth();
// => 3
datetime.getHours();
// => 10
datetime.getMinutes();
// => 15
datetime.getSeconds();
// => 30
Comme la classe LocalDate, une instance de LocalDateTime dispose des mêmes méthodes pour la comparer à d'autres LocalDateTime et pour lui ajouter des unités de temps.
Il est également possible de convertir une instance de LocalDate en LocalDateTime :
LocalDate date = LocalDate.of(2007, 12, 3);
LocalDateTime datetime = date.atTime(10, 15, 30);
datetime.toString();
// => "2007-12-03T10:15:30"
LocalDate et LocalDateTime utilisent tous les deux la notation standard ISO-8601 pour la conversion depuis et vers une String.
LocalDateTime datetime = LocalDateTime.of(2007, 12, 3, 10, 15, 30);
LocalDateTime parsed = LocalDateTime.parse("2007-12-03T10:15:30");
datetime.isEqual(parsed);
// => true
Il n'est pas possible d'analyser un objet LocalDate ou LocalDateTime à partir d'une String de ce type dans un autre format.
Pour formater des dates avec un format personnalisé, il faut plutôt utiliser la classe java.time.format.DateTimeFormatter :
DateTimeFormatter parser = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate date = LocalDate.parse("03/12/2007", formatter);
DateTimeFormatter printer = DateTimeFormatter.ofPattern("MMMM d, yyyy");
printer.format(date);
// => "December 3, 2007"
Il est également possible de préciser une locale lors de la création du format personnalisé, afin de formater et d'analyser des dates pour différentes régions :
DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.FRENCH).format(date);
// => décembre 3, 2007
DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.of("pt")).format(date);
// => dezembro 3, 2007