Différence simple (sans lib)
/**
* Get a diff between two dates
* @param date1 the oldest date
* @param date2 the newest date
* @param timeUnit the unit in which you want the diff
* @return the diff value, in the provided unit
*/
public static long getDateDiff(Date date1, Date date2, TimeUnit timeUnit) {
long diffInMillies = date2.getTime() - date1.getTime();
return timeUnit.convert(diffInMillies,TimeUnit.MILLISECONDS);
}
Et ensuite vous pouvez appeler :
getDateDiff(date1,date2,TimeUnit.MINUTES);
pour obtenir la différence entre les deux dates en unités de minutes.
TimeUnit
es java.util.concurrent.TimeUnit
un enum standard Java allant des nanos aux jours.
Différentiel lisible par l'homme (sans lib)
public static Map<TimeUnit,Long> computeDiff(Date date1, Date date2) {
long diffInMillies = date2.getTime() - date1.getTime();
//create the list
List<TimeUnit> units = new ArrayList<TimeUnit>(EnumSet.allOf(TimeUnit.class));
Collections.reverse(units);
//create the result map of TimeUnit and difference
Map<TimeUnit,Long> result = new LinkedHashMap<TimeUnit,Long>();
long milliesRest = diffInMillies;
for ( TimeUnit unit : units ) {
//calculate difference in millisecond
long diff = unit.convert(milliesRest,TimeUnit.MILLISECONDS);
long diffInMilliesForUnit = unit.toMillis(diff);
milliesRest = milliesRest - diffInMilliesForUnit;
//put the result in the map
result.put(unit,diff);
}
return result;
}
http://ideone.com/5dXeu6
Le résultat est quelque chose comme Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0}
avec les unités commandées.
Il vous suffit de convertir cette carte en une chaîne de caractères conviviale.
Avertissement
Les extraits de code ci-dessus calculent une simple différence entre 2 instants. Cela peut poser des problèmes lors d'un changement d'heure d'été, comme expliqué dans ce poste . Cela signifie que si vous calculez la différence entre des dates sans heure, il se peut qu'il manque un jour/une heure.
À mon avis, la différence de date est un peu subjective, surtout pour les jours. Vous pouvez :
-
compter le nombre de 24h écoulées : jour+1 - jour = 1 jour = 24h
-
compter le nombre de temps écoulé, en tenant compte de l'heure d'été : jour+1 - jour = 1 = 24h (mais en utilisant l'heure de minuit et l'heure d'été, cela pourrait être 0 jour et 23h)
-
compter le nombre de day switches
ce qui signifie que jour+1 13h - jour 11h = 1 jour, même si le temps écoulé n'est que de 2h (ou 1h en cas d'heure d'été :p).
Ma réponse est valable si votre définition de la différence de date sur les jours correspond au 1er cas.
Avec JodaTime
Si vous utilisez JodaTime, vous pouvez obtenir la différence pour 2 dates instantanées (millièmes soutenus ReadableInstant) avec :
Interval interval = new Interval(oldInstant, new Instant());
Mais vous pouvez également obtenir la différence pour les dates/heures locales :
// returns 4 because of the leap year of 366 days
new Period(LocalDate.now(), LocalDate.now().plusDays(365*5), PeriodType.years()).getYears()
// this time it returns 5
new Period(LocalDate.now(), LocalDate.now().plusDays(365*5+1), PeriodType.years()).getYears()
// And you can also use these static methods
Years.yearsBetween(LocalDate.now(), LocalDate.now().plusDays(365*5)).getYears()
12 votes
Pourquoi pas d'amour pour Joda Time ? C'est à peu près la meilleure option si vous voulez traiter des dates en Java.
9 votes
Veuillez consulter mon élégante solution à 2 lignes, sans utiliser Joda et en donnant le résultat dans n'importe quel TimeUnit à l'adresse suivante stackoverflow.com/a/10650881/82609
0 votes
Essayez ceci : mkyong.com/java/how-to-calculate-date-time-difference-in-java
6 votes
Honte à tous ceux qui recommandent Joda time, et ne recommandent pas une vraie réponse Java...
0 votes
Pour la plupart des solutions présentées ici et ailleurs, elles sont inexactes lorsque l'heure d'été est prise en compte. En effet, lorsque 24 heures sont ajoutées au samedi 2016-03-26T23:30 CET, la date résultante est 2016-03-28T00:30 CET et deux frontières de jours sont franchies, En effet, le DST entre en vigueur le dimanche 2016-03-27T02:00 Central European Time. Le problème de l'heure d'été n'est pas spécifique à l'heure d'Europe centrale et se produit chaque fois que la période considérée contient l'entrée en vigueur de l'heure d'été.
4 votes
@Zizouz212 En ce qui concerne la recommandation de Joda-Time, les anciennes classes de date-heure fournies avec Java sont mauvaises, vraiment mauvaises, mal conçues, confuses et gênantes. Si mauvais que Joda-Time est devenu un énorme succès en tant que leur remplacement. Elles sont si mauvaises que même Sun/Oracle les a abandonnées et a adopté le paquetage java.time dans le cadre de Java 8 et des versions ultérieures. Les classes java.time sont inspirées de Joda-Time. Joda-Time et java.time sont tous deux dirigés par le même homme, Stephen Colbourne . Je dirais : " Honte à quiconque recommande l'utilisation de
Date
,Calendar
ySimpleDateFormat
".0 votes
@BasilBourque Le PO a demandé une "manière plus simple et plus agréable d'obtenir un delta de temps" ; une rapide différence de deux lignes semble plus simple et plus agréable que de demander une dépendance externe.
4 votes
Si Joda Time était probablement une bonne réponse lorsque la question a été posée, aujourd'hui la meilleure réponse pour quiconque peut utiliser Java 8 est d'utiliser
java.time.Period
et/ouDuration
. Voir Réponse de Basil Bourque ci-dessous .1 votes
Vous pouvez également consulter Calculer les jours entre deux dates en Java 8 . Tout en évitant toute dépendance externe.