Comment obtenir toutes les dates entre deux dates?

Comment obtenir toutes les dates entre deux dates?

1. Vue d'ensemble

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

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

2. Utiliser Java 7

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

Voici le code le démontrant - en utilisant l'instanceCalendar:

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. Utiliser Java 8

Dans Java 8, nous pouvons maintenant créer unStream infini continu de dates et ne prendre que la partie pertinente. Malheureusement,there is no way of terminating an infinite Stream when a predicate gets matched - c'est pourquoi nous devons calculer le nombre de jours entre ces deux jours et ensuite simplementlimit() lesStream:

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 en utilisant la fonctionbetween - associée à la constanteDAYS de l'énumérationChronoUnit.

Ensuite, nous créons unStream d'entiers représentant le nombre de jours depuis la date de début. Dans l'étape suivante, nous convertissons nos entiers en objetsLocalDate à l'aide de l'APIplusDays().

Enfin, nous recueillons 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éthodedatesUntil dédiée d'une classeLocalDate. LedatesUntill renvoie lesStream séquentiellement ordonnés de dates à 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 d'opérations sur les littéraux de date et dans Java 9, cela peut être fait en appelant simplementdatesUntil.

Et, comme toujours, les extraits de code peuvent être trouvésover on GitHub.