Comment obtenir toutes les dates entre deux dates?

1. Vue d'ensemble

La nouvelle API Time introduite dans Java 8 a permis de traiter la date et l'heure sans utiliser de bibliothèques externes.

Dans ce court didacticiel, nous verrons comment obtenir toutes les dates entre deux dates devient plus facile au fil du temps dans différentes versions de Java.

2. Utilisation de Java 7

Dans Java 7, une façon de le calculer consiste à utiliser une instance de Calendar , à exécuter une boucle et à ajouter 1 jour à chaque itération à l'aide de la méthode add et de l' unité de champ Calendar.Date , il atteint la date de fin.

Voici le code le démontrant - en utilisant l' instance de Calendar :

public static List getDatesBetweenUsingJava7( Date startDate, Date endDate) { List datesInRange = new ArrayList(); Calendar calendar = new GregorianCalendar(); calendar.setTime(startDate); Calendar endCalendar = new GregorianCalendar(); endCalendar.setTime(endDate); while (calendar.before(endCalendar)) { Date result = calendar.getTime(); datesInRange.add(result); calendar.add(Calendar.DATE, 1); } return datesInRange; }

3. Utilisation de Java 8

Dans Java 8, nous pouvons maintenant créer un Stream infini continu de dates et ne prendre que la partie pertinente. Malheureusement, il n'y a aucun moyen de terminer un Stream infini lorsqu'un prédicat est mis en correspondance - c'est pourquoi nous devons calculer le nombre de jours entre ces deux jours, puis simplement limiter () le Stream:

public static List getDatesBetweenUsingJava8( LocalDate startDate, LocalDate endDate) { long numOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate); return IntStream.iterate(0, i -> i + 1) .limit(numOfDaysBetween) .mapToObj(i -> startDate.plusDays(i)) .collect(Collectors.toList()); } 

Remarquez comment, tout d'abord, nous pouvons obtenir la différence de jours entre deux dates à l'aide de la fonction entre - associée à la constante DAYS de l' énumération ChronoUnit .

Ensuite, nous créons un Stream d'entiers représentant le nombre de jours depuis la date de début. Dans l'étape suivante, nous convertissons nos entiers en objets LocalDate à l'aide de l' API plusDays () .

Enfin, nous rassemblons tout dans une instance de liste.

4. Utilisation de Java 9

Enfin, Java 9 apporte des méthodes dédiées pour calculer ceci:

public static List getDatesBetweenUsingJava9( LocalDate startDate, LocalDate endDate) { return startDate.datesUntil(endDate) .collect(Collectors.toList()); }

Nous pouvons obtenir les dates entre deux dates avec un seul appel de méthode en utilisant la méthode dédiée datesUntil d'une classe LocalDate . La valeur datesUntill renvoie le flux de dates ordonné séquentiellement à partir de l'objet date dont la méthode est appelée jusqu'à la date donnée comme argument de méthode.

5. Conclusion

Dans cet article rapide, nous avons examiné comment obtenir toutes les dates entre deux dates en utilisant les différentes versions de Java.

Nous avons expliqué comment l'API Time introduite dans la version Java 8 facilitait l'exécution des opérations sur les littéraux de date et dans Java 9, cela peut être fait en appelant simplement datesUntil.

Et, comme toujours, les extraits de code peuvent être trouvés sur GitHub.