Le package java.time, introduit dans Java 8, contient plusieurs classes pour manipuler des dates et des 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 dispose d'accesseurs pour en extraire les composantes temporelles :
LocalDate date = LocalDate.of(2007, 12, 3);
date.getDayOfMonth();
// => 3
Une instance de LocalDate dispose de 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
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);
On peut 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 comme LocalDateTime utilisent la notation standard ISO-8601 pour convertir 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 une LocalDate ou une LocalDateTime à partir d'une String comme celle-ci en utilisant un format différent.
À la place, pour formater des dates selon un format personnalisé, il faut utiliser java.time.format.DateTimeFormatter :
DateTimeFormatter parser = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate date = LocalDate.parse("03/12/2007", parser);
DateTimeFormatter printer = DateTimeFormatter.ofPattern("MMMM d, yyyy");
printer.format(date);
// => "December 3, 2007"
On peut aussi préciser une locale lors de la création du format personnalisé, afin de formater et d'analyser selon 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
Dans cet exercice, tu vas travailler sur un planificateur de rendez-vous pour un salon de beauté à New York, ouvert le 15 septembre 2012.
Implémente la méthode AppointmentScheduler.schedule() pour analyser une représentation textuelle d'une date de rendez-vous et la convertir en LocalDateTime correspondant :
AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.schedule("7/25/2019 13:45:00");
// => LocalDateTime.of(2019, 7, 25, 13, 45, 0)
Implémente la méthode AppointmentScheduler.hasPassed() qui prend une date de rendez-vous et vérifie si le rendez-vous se situe quelque part dans le passé :
AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.hasPassed(LocalDateTime.of(1999, 12, 31, 9, 0, 0));
// => true
Implémente la méthode AppointmentScheduler.isAfternoonAppointment() qui prend une date de rendez-vous et vérifie si le rendez-vous a lieu l'après-midi (>= 12:00 et < 18:00) :
AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.isAfternoonAppointment(LocalDateTime.of(2019, 03, 29, 15, 0, 0))
// => true
Implémente la méthode AppointmentScheduler.getDescription() qui prend une date de rendez-vous et renvoie une description de cette date et de cette heure :
AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.getDescription(LocalDateTime.of(2019, 03, 29, 15, 0, 0))
// => "You have an appointment on Friday, March 29, 2019, at 3:00 PM."
Implémente la méthode AppointmentScheduler.getAnniversaryDate() qui renvoie la date anniversaire de cette année, à savoir le 15 septembre :
AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.getAnniversaryDate()
// => LocalDate.of(<current year>, 9, 15)
Inscris-toi sur Exercism pour apprendre et maîtriser Java avec 26 concepts158 exercices, et un vrai mentorat humain, le tout gratuitement.