Calculer les jours entre deux dates en Java 8
Je sais qu'il y a beaucoup de questions sur SO sur la façon d'obtenir, mais je veux et l'exemple en utilisant la nouvelle api Java 8 Date. Je connais aussi la bibliothèque JodaTime, mais je veux un moyen de travail sans bibliothèques externes.
La fonction doit se plaindre avec ces restrictions:
- prévenir les erreurs de date savetime
- les entrées sont deux objets de Date (sans heure, je connais localdatetime, mais je dois faire avec les instances de date)
9 réponses
Si vous voulez logiques jours calendrier, utiliser DAYS.between() méthode de java.time.temporal.ChronoUnit:
LocalDate dateBefore;
LocalDate dateAfter;
long daysBetween = DAYS.between(dateBefore, dateAfter);
Si vous voulez littéral 24 heures jours , (a Durée), vous pouvez utiliser le Duration classe à la place:
LocalDate today = LocalDate.now()
LocalDate yesterday = today.minusDays(1);
// Duration oneDay = Duration.between(today, yesterday); // throws an exception
Duration.between(today.atStartOfDay(), yesterday.atStartOfDay()).toDays() // another option
Pour plus d'informations, reportez-vous à ce document (et d'autres documents re:Java 8 d'Oracle).
Basé sur les commentaires de VGR, voici ce que vous pouvez utiliser:
ChronoUnit.DAYS.between(firstDate, secondDate)
Vous pouvez utiliser until():
LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4);
LocalDate christmas = LocalDate.of(2014, Month.DECEMBER, 25);
System.out.println("Until christmas: " + independenceDay.until(christmas));
System.out.println("Until christmas (with crono): " + independenceDay.until(christmas, ChronoUnit.DAYS));
Vous pouvez utiliser DAYS.between à partir de java.time.temporal.ChronoUnit
Par exemple
import java.time.temporal.ChronoUnit;
public long getDaysCountBetweenDates(LocalDate dateBefore, LocalDate dateAfter) {
return DAYS.between(dateBefore, dateAfter);
}
Utilisez les jours dans enum java.temps.temporel.ChronoUnit . Voici l'exemple de Code:
Sortie : *Le nombre de jours entre la date de début: 2015-03-01 et la date de fin: 2016-03-03 est = = > 368. **Nombre de jours entre la date de début : 2016-03-03 et date de fin : 2015-03-01 est ==> -368*
package com.bitiknow.date;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
/**
*
* @author pradeep
*
*/
public class LocalDateTimeTry {
public static void main(String[] args) {
// Date in String format.
String dateString = "2015-03-01";
// Converting date to Java8 Local date
LocalDate startDate = LocalDate.parse(dateString);
LocalDate endtDate = LocalDate.now();
// Range = End date - Start date
Long range = ChronoUnit.DAYS.between(startDate, endtDate);
System.out.println("Number of days between the start date : " + dateString + " and end date : " + endtDate
+ " is ==> " + range);
range = ChronoUnit.DAYS.between(endtDate, startDate);
System.out.println("Number of days between the start date : " + endtDate + " and end date : " + dateString
+ " is ==> " + range);
}
}
Voilà:
public class DemoDate {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
System.out.println("Current date: " + today);
//add 1 month to the current date
LocalDate date2 = today.plus(1, ChronoUnit.MONTHS);
System.out.println("Next month: " + date2);
// Put latest date 1st and old date 2nd in 'between' method to get -ve date difference
long daysNegative = ChronoUnit.DAYS.between(date2, today);
System.out.println("Days : "+daysNegative);
// Put old date 1st and new date 2nd in 'between' method to get +ve date difference
long datePositive = ChronoUnit.DAYS.between(today, date2);
System.out.println("Days : "+datePositive);
}
}
Tout le monde dit d'utiliser ChronoUnit.JOUR.entre mais cela ne fait que déléguer à une autre méthode que vous pourriez vous appeler. Donc, vous pouvez aussi faire firstDate.until(secondDate, ChronoUnit.DAYS).
Les documents pour les deux mentionnent réellement les deux approches et disent d'utiliser celle qui est la plus lisible.
Obtenez le nombre de jours avant Noël à partir du jour en cours, essayez ceci
System.out.println(ChronoUnit.DAYS.between(LocalDate.now(),LocalDate.of(Year.now().getValue(), Month.DECEMBER, 25)));
Get jours entre deux dates date est une instance de java.util.Date
public static long daysBetweenTwoDates(Date dateFrom, Date dateTo) {
return DAYS.between(Instant.ofEpochMilli(dateFrom.getTime()), Instant.ofEpochMilli(dateTo.getTime()));
}