Come ottenere tutte le date tra due date?

1. Panoramica

La nuova Time API introdotta in Java 8 ha reso possibile l'elaborazione di data e ora senza utilizzare librerie esterne.

In questo breve tutorial, daremo un'occhiata a come ottenere tutte le date tra due date diventa più facile nel tempo nelle diverse versioni di Java.

2. Utilizzo di Java 7

In Java 7, un modo per calcolarlo è utilizzare l' istanza di Calendar , eseguire un ciclo e aggiungere 1 giorno in ogni iterazione utilizzando il metodo add e l' unità di campo Calendar.Date raggiunge la data di fine.

Ecco il codice che lo dimostra, utilizzando l' istanza di 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. Utilizzo di Java 8

In Java 8, ora possiamo creare un flusso infinito continuo di date e prendere solo la parte pertinente. Sfortunatamente, non c'è modo di terminare uno Stream infinito quando un predicato viene abbinato - questo è il motivo per cui dobbiamo calcolare il numero di giorni tra quei due giorni e poi semplicemente limitare () lo 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()); } 

Si noti come, in primo luogo, possiamo ottenere la differenza di giorni tra due date utilizzando la funzione between , associata alla costante DAYS dell'enumerazione ChronoUnit .

Quindi creiamo un flusso di numeri interi che rappresenta il numero di giorni dalla data di inizio. Nel passaggio successivo, convertiamo i nostri numeri interi in oggetti LocalDate utilizzando l' API plusDays () .

Infine, raccogliamo tutto in un'istanza di elenco.

4. Utilizzo di Java 9

Infine, Java 9 offre metodi dedicati per il calcolo:

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

Possiamo ottenere le date tra due date con una singola chiamata al metodo utilizzando il metodo dateUntil dedicato di una classe LocalDate . Il datesUntill restituisce la sequenza ordinata flusso date a partire dall'oggetto data cui metodo è chiamato alla data indicata come metodo di argomento.

5. conclusione

In questo rapido articolo, abbiamo esaminato come possiamo ottenere tutte le date tra due date utilizzando le diverse versioni di Java.

Abbiamo discusso di come l'API Time introdotta nella versione Java 8 abbia reso più facile eseguire operazioni su date letterali e in Java 9, può essere eseguita semplicemente chiamando dateUntil.

E, come sempre, gli snippet di codice possono essere trovati su GitHub.