Simple diff (without lib)
/**
* Obtenir une différence entre deux dates
* @param date1 la date la plus ancienne
* @param date2 la date la plus récente
* @param timeUnit l'unité dans laquelle vous souhaitez la différence
* @return la valeur de la différence, dans l'unité fournie
*/
public static long getDateDiff(Date date1, Date date2, TimeUnit timeUnit) {
long diffInMillies = date2.getTime() - date1.getTime();
return timeUnit.convert(diffInMillies, TimeUnit.MILLISECONDS);
}
Ensuite, vous pouvez appeler:
getDateDiff(date1, date2, TimeUnit.MINUTES);
pour obtenir la différence des 2 dates en unité de minutes.
TimeUnit
est java.util.concurrent.TimeUnit
, une énumération standard de Java allant de nanosecondes à jours.
Différence lisible par l'homme (sans lib)
public static Map computeDiff(Date date1, Date date2) {
long diffInMillies = date2.getTime() - date1.getTime();
// créer la liste
List units = new ArrayList(EnumSet.allOf(TimeUnit.class));
Collections.reverse(units);
// créer la carte résultat de TimeUnit et de différence
Map result = new LinkedHashMap();
long milliesRest = diffInMillies;
for (TimeUnit unit : units) {
// calculer la différence en millisecondes
long diff = unit.convert(milliesRest, TimeUnit.MILLISECONDS);
long diffInMilliesForUnit = unit.toMillis(diff);
milliesRest = milliesRest - diffInMilliesForUnit;
// mettre le résultat dans la carte
result.put(unit, diff);
}
return result;
}
http://ideone.com/5dXeu6
La sortie ressemble à Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0}
, avec les unités ordonnées.
Il vous suffit de convertir cette carte en une chaîne conviviale pour l'utilisateur.
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 cet article. Cela signifie que si vous calculez la différence entre des dates sans heure, vous pouvez avoir un jour/heure manquante.
À mon avis, la différence de dates est quelque peu subjective, surtout en ce qui concerne les jours. Vous pouvez :
-
compter le nombre de temps écoulé de 24h : jour+1 - jour = 1 jour = 24h
-
comptez 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)
-
comptez le nombre de changements de jour
, ce qui signifie jour+1 13h - jour 11h = 1 jour, même si le temps écoulé n'est que de 2h (ou 1h s'il y a une heure d'été :p)
Ma réponse est valable si votre définition de la différence de dates sur les jours correspond au 1er cas
Avec JodaTime
Si vous utilisez JodaTime, vous pouvez obtenir la différence pour 2 instants (dates millisecondes supportées par ReadableInstant) avec :
Interval interval = new Interval(oldInstant, new Instant());
Mais vous pouvez également obtenir la différence pour des dates/heure locales :
// retourne 4 en raison de l'année bissextile de 366 jours
new Period(LocalDate.now(), LocalDate.now().plusDays(365*5), PeriodType.years()).getYears()
// cette fois-ci elle renvoie 5
new Period(LocalDate.now(), LocalDate.now().plusDays(365*5+1), PeriodType.years()).getYears()
// Et vous pouvez également utiliser ces méthodes statiques
Years.yearsBetween(LocalDate.now(), LocalDate.now().plusDays(365*5)).getYears()
12 votes
Pourquoi pas d'amour pour joda time? C'est pratiquement la meilleure option si vous devez gérer les dates en java.
9 votes
Veuillez vérifier ma solution élégante en 2 lignes, sans utiliser Joda et en donnant le résultat dans n'importe quelle unité de temps sur 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 en Java...
0 votes
Pour la plupart des solutions exposées ici et ailleurs, elles sont inexactes lorsque l'heure d'été (DST) 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, l'heure d'été entre en vigueur le dimanche 2016-03-27T02:00 heure d'Europe centrale. Le problème de l'heure d'été n'est pas spécifique au CET et se produit chaque fois que la période considérée contient le passage à l'heure d'été.
4 votes
@Zizouz212 En ce qui concerne la recommandation de Joda-Time, les anciennes classes date-heure groupées avec Java sont mauvaises, vraiment mauvaises, mal conçues, confuses et problématiques. Tellement mauvaises que Joda-Time est devenu un énorme succès en tant que remplacement. Tellement mauvaises que même Sun/Oracle les a abandonnées et a adopté le package java.time dans Java 8 et plus tard. Les classes java.time sont inspirées de Joda-Time. Tant Joda-Time que java.time sont dirigés par le même homme, Stephen Colbourne. Je dirais, "Honte à quiconque recommande l'utilisation de
Date
,Calendar
etSimpleDateFormat
".0 votes
@BasilBourque a demandé un "moyen plus simple et plus agréable d'obtenir un delta de temps"; une différence rapide de deux lignes semble plus simple/agréable que de nécessiter une dépendance externe.
4 votes
Tandis que 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 la réponse de Basil Bourque ci-dessous.1 votes
Vous pouvez également consulter Calculer les jours entre deux dates en Java 8. Et toujours éviter toute dépendance externe.