Le calcul de la différence entre Java deux occurrences de date
Je suis à l'aide de Java java.util.Date
classe de Scala et souhaitez comparer un Date
objet et l'heure actuelle. Je sais que je peux calculer le delta en utilisant getTime():
(new java.util.Date()).getTime() - oldDate.getTime()
Cependant, cela me laisse avec un long
représentant millisecondes. Est-il plus simple, plus agréable façon à obtenir un temps de delta?
- Pourquoi pas d'amour pour joda time? C'est à peu près la meilleure option si vous êtes en train de traiter avec des dates en java.
- Veuillez vérifier mes élégant 2 lignes solution, sans l'aide de Joda et donner le résultat en tout TimeUnit stackoverflow.com/a/10650881/82609
- essayez ceci: mkyong.com/java/how-to-calculate-date-time-difference-in-java
- Honte à tous ceux qui recommandent Joda temps, et ne pas recommander un vrai Java réponse...
- Pour la plupart des solutions proposées ici et d'ailleurs, elles sont inexactes lors de l'heure d'été (DST) est pris en compte. En effet, quand 24 heures sont ajoutés au samedi 2016-03-26T23:30 CET, la date obtenue est 2016-03-28T00:30 (HEC) et de deux jours du franchissement des frontières, en Effet, l'heure d'été va en effet, le dimanche 2016-03-27T02:00 Heure d'europe Centrale. Le problème de l'heure d'été n'est pas spécifique à CET et se produit chaque tme de la période considérée contient de l'heure d'été va en effet.
- Concernant recommander Joda-Time, la vieille date-heure classes livré avec Java sont mauvais, vraiment mauvais, mal conçue, de la confusion, et gênants. Tellement mauvais que Joda-Time est devenue un immense succès de leur remplacement. Tellement mauvais que même Sun/Oracle a donné sur eux, et a adopté le java.en temps dans le cadre de Java 8 et les versions ultérieures. La java.les classes de temps sont inspirés par Joda-Time. Les deux Joda-Time et java.les temps sont dirigés par le même homme, Stephen Colbourne. Je dirais, “Honte à tous ceux de recommander l'utilisation de
Date
,Calendar
, etSimpleDateFormat
”. - OP demandé un "plus simple, plus agréable façon à obtenir un temps de delta"; un rapide, deux lignes de comparaison semble plus simple/plus agréable que d'exiger une dépendance externe.
- Alors que Joda Time était probablement une bonne réponse quand la question a été posée, aujourd'hui la meilleure réponse pour n'importe qui peut utiliser Java 8 est d'utiliser
java.time.Period
et/ouDuration
. Voir le Basilic Bourque réponse ci-dessous. - Vous pouvez également regarder les Calculer le nombre de jours entre deux dates en Java 8. Et encore éviter toute dépendance externe.
Vous devez vous connecter pour publier un commentaire.
Le JDK
Date
API est horriblement cassé malheureusement. Je recommande d'utiliser Joda Time library.Joda Time a une notion de temps Intervalle de:
EDIT: En passant, Joda a deux concepts:
Interval
pour la représentation d'un intervalle de temps entre deux instants (représentent le temps entre 8h et 10h), et unDuration
qui représente une longueur de temps sans que les limites de temps (par exemple, représentent deux heures!)Si vous ne se soucient que de temps comparisions, la plupart des
Date
implémentations (y compris le JDK un) met en œuvreComparable
interface qui vous permet d'utiliser laComparable.compareTo()
Comparable.compareTo()
, pasComparable.compare()
.java.time
package en Java 8 est inspiré par Joda-Temps mais n'est pas un simple remplacement. Chacun a ses avantages et inconvénients. Heureusement, vous n'avez pas à choisir entre eux. Utilisation de chacun de ses points forts, aussi longtemps que vous êtes prudent avec votreimport
consolidés. Voir cette autre réponse par exemple de java.temps.Simple diff (sans lib)
Et vous pouvez appeler:
pour obtenir la diff des 2 dates dans les minutes de l'unité.
TimeUnit
estjava.util.concurrent.TimeUnit
, un standard de Java enum allant de nanos pour jours.Lisible par l'homme diff (sans lib)
http://ideone.com/5dXeu6
La sortie 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.Vous suffit de convertir qui correspond à un convivial chaîne.
Avertissement
Le code ci-dessus des extraits de calculer un simple diff entre 2 instants. Il peut causer des problèmes pendant l'heure d'été de l'interrupteur, comme expliqué dans le ce post. Cela signifie que si vous calculez la diff entre les dates avec un rien de temps vous pouvez avoir un manque de jour/heure.
À mon avis la date de diff est une sorte de subjectivité, surtout sur jours. Vous pouvez:
compter le nombre de 24h le temps écoulé: jour+1 jour = 1 jour = 24h
compter le nombre de temps écoulé, en prenant soin de l'heure d'été: jour+1 jour = 1 = 24h (mais l'utilisation de minuit l'heure et de l'heure d'été, il pourrait être de 0 jour et 23h)
compter le nombre de
day switches
, ce qui signifie jour+1 1pm jours de 11h = 1 journée, même si le temps écoulé est juste 2h (ou 1h si il y a une heure :p)Ma réponse est valable que si votre définition de la date de diff sur les jours de match le 1er cas
Avec JodaTime
Si vous utilisez JodaTime vous pouvez obtenir le diff pour 2 instants (millies soutenu ReadableInstant) dates:
Mais vous pouvez aussi faire la diff Locales pour les dates/heures:
java.util.concurrent.TimeUnit
Notez que cela fonctionne avec les dates UTC, donc, la différence peut être un jour de congé si vous regardez les dates locales. Et à la faire fonctionner correctement avec les dates locales nécessite une approche totalement différente en raison de l'heure avancée.
Date startDate = new Date();
Date endDate = new Date();
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
int rosterDays = 0;
try
{
startDate = formatter.parse("26/02/2015");
endDate = formatter.parse("26/03/2015");
rosterDays = (int)(endDate.getTime() - startDate.getTime()) / ((1000 * 60 * 60 * 24));
}
catch (ParseException e)
{}
System.out.println("rosterDays = " + rosterDays);
Désolé pour le formatage, je ne peux pas voir comment formater mieux!(endDate.getTime() - startDate.getTime())
d'être jeté àint
au lieu du résultat final, et vous obtenez un dépassement d'entier.double diffInSeconds = ((after.getTime() - b4.getTime()) / 1000d);
getTime()
renvoie une longue, de sorte qu'il est probablement mieux d'utiliser un long temps dans ces calculs.Vous devez définir votre problème plus clairement. Vous pourrait il suffit de prendre le nombre de millisecondes entre les deux
Date
objets et de les diviser par le nombre de millisecondes dans les 24 heures, par exemple... mais:Date
est toujours en UTCÀ l'aide de la java.le temps cadre intégré dans Java 8+:
De sortie:
Pour plus d'info, voir le Oracle Tutoriel et la ISO 8601 standard.
Period
au lieu deDuration
pour les dates.tl;dr
Convertir votre obsolètes
java.util.Date
les objets à leur remplacement,java.time.Instant
. Puis de calculer le temps écoulé comme unDuration
.Format ISO 8601:
PnYnMnDTnHnMnS
Le sensible standard ISO 8601 définit une forme concise, la représentation textuelle d'un laps de temps qu'un certain nombre d'années, mois, jours, heures, etc. La norme exige que de tels une durée de un durée. Le format est
PnYnMnDTnHnMnS
où laP
signifie "Période", leT
sépare la partie date de la partie heure, et entre les deux sont des chiffres suivis d'une lettre.Exemples:
P3Y6M4DT12H30M5S
trois ans, six mois, quatre jours, douze heures, trente minutes et cinq secondes
PT4H30M
Quatre heures et demie
java.temps
La java.le temps cadre intégré dans Java 8 et, plus tard, supplante le gênants vieux
java.util.Date
/java.util.Calendar
classes. Les nouvelles classes sont inspirés par la très réussie Joda-Time cadre, comme son successeur, un concept similaire, mais ré-architecturé. Défini par JSR 310. Prolongé par le ThreeTen-Extra projet. Voir la Tutoriel.Moment
La
Instantané
classe représente un moment dans le scénario de UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).Mieux éviter de l'héritage des classes comme
Date
/Calendar
. Mais si vous devez inter-opérer avec de l'ancien code pas encore mis à jour à java.temps, convertir en arrière et en avant. Appelle de nouvelles méthodes de conversion ajouté des anciennes classes. Pour passer d'unejava.util.Date
à unInstantané
, appelDate: toInstant
.Laps de temps
La java.les classes de temps avoir partagé cette idée de représenter un laps de temps qu'un certain nombre d'années, mois, jours, heures, minutes, secondes en deux moitiés:
Délai
pendant des années, les mois, les joursDurée
de jours, heures, minutes, secondesIci est un exemple.
De vidage de la console.
Les deux
Period
etDuration
utiliser le ISO 8601 standard pour la génération d'une représentation de Chaîne de valeur.Java 9 ajoute des méthodes de
Duration
pour obtenir les jours de la partie, heures le cadre, à quelques minutes de la partie, et les secondes de la partie.Vous pouvez obtenir le nombre total de jours ou en heures ou en minutes ou en secondes ou millisecondes ou nanosecondes dans l'ensemble de la Durée.
En Java 9 la
Durée
de la classe obtient de nouvelles méthodes pour le retour les différentes parties de jours, heures, minutes, secondes, millisecondes/nanosecondes. Appelez leto…Part
méthodes:toDaysPart()
,toHoursPart()
, et ainsi de suite.ChronoUnit
Si vous ne se soucient plus simples, plus grande granularité de temps, tels que le “nombre de jours écoulés”, utilisez la
ChronoUnit
enum.Un autre exemple.
Sur java.temps
La java.le temps cadre est intégré dans Java 8 et les versions ultérieures. Ces classes permettent d'éviter la pénible vieux héritage date du temps des classes comme
java.util.Date
,Agenda
, &SimpleDateFormat
.La Joda-Time projet, maintenant dans le mode de maintenance, conseille la migration vers java.temps.
Pour en savoir plus, consultez les Oracle Tutoriel. Et de recherche de Débordement de Pile pour de nombreux exemples et des explications. La spécification est JSR 310.
Où obtenir le java.les classes de temps?
La ThreeTen-Extra projet s'étend java.temps avec d'autres classes. Ce projet est un terrain d'essai pour de possibles futurs ajouts à java.temps. Vous pouvez trouver quelques classes utiles ici comme
Intervalle
,YearWeek
,YearQuarter
, et plus.Joda-Time
Mise à JOUR: Le Joda-Time projet est maintenant dans le mode de maintenance, avec l'équipe conseiller de la migration vers le java.le temps classes. Je laisse cette section intacte pour l'histoire.
La Joda-Time library utilise la norme ISO 8601 pour sa valeur par défaut. Son
Period
classe d'analyse et génère ces PnYnMnDTnHnMnS chaînes.Rend:
Period
,Duration
, etChronoUnit
, trois classes dont le but est de déterminer le delta entre les points de temps. Veuillez indiquer quelles parties de mon “mur de texte” ne sont pas pertinents. Et vous vous êtes trompé en disant que la Question posée pour un “delta entre les dates”: La Question posée pour un delta entreDate
objets, qui sont de date-heure moments, pas les “dates” en dépit de son malheureux de nommage de cette classe.java.util.Date
à unInstant
(appelez simplement.toInstant
). Et j'ai ajouté leMoment
section à expliquer. Vous avez mentionné une paire deDate
objets, mais effectivement, la Question n'utilise qu'une seule existanteDate
objet et saisit le moment, j'ai donc fait la même. Merci pour les commentaires! Astuce: Donnez sur l'utilisation deDate
– Ces anciennes classes sont vraiment un terrible misérable mess.https://www.joda.org/joda-time/faq.html#datediff
Un peu plus simple alternative:
Pour "le plus beau": eh bien, qu'est-ce exactement avez-vous besoin? Le problème avec les représentant des durées de temps qu'un certain nombre d'heures et de jours etc. c'est qu'il peut conduire à des inexactitudes et de fausses attentes en raison de la complexité de dates (par exemple, les jours peuvent avoir 23 ou 25 heures en raison de l'heure avancée).
À l'aide de la milliseconde approche peut causer des problèmes dans certaines localités.
Prenons, par exemple, la différence entre les deux dates 03/24/2007 et 03/25/2007 devrait être de 1 jour;
Cependant, l'utilisation de l'ordre de la milliseconde route, vous aurez 0 jours, si vous exécutez ce dans le royaume-UNI!
Meilleure façon de mettre en œuvre ce qui est de l'utilisation de java.util.Calendrier
Il ya beaucoup de façons dont vous pouvez trouver la différence entre deux dates & fois. L'une des façons les plus simples que je connaisse serait:
L'instruction print est juste un exemple - vous pouvez la mettre en forme comme vous le souhaitez.
Depuis ici toutes les réponses sont correctes, mais utiliser des anciennes versions de java ou 3ème partie libs comme joda ou similaire, je viens de déposer une autre façon en utilisant de nouveaux java.le temps classes en Java 8 et les versions ultérieures. Voir Oracle Tutoriel.
Utilisation
LocalDate
etChronoUnit
:Soustrayant la date en millisecondes œuvres (comme décrit dans un autre post), mais vous ont à utiliser HOUR_OF_DAY et pas d'HEURE lors de la suppression des temps de parties de vos dates:
Si vous ne souhaitez pas utiliser JodaTime ou similaires, la meilleure solution est probablement de cette:
Le nombre de ms par jour n'est pas toujours le même (à cause de l'heure d'été et les secondes intercalaires), mais il est très proche, et au moins les écarts en raison de l'heure d'été annuler sur de longues périodes. Par conséquent, la division et ensuite arrondi donnera un résultat correct (au moins aussi longtemps que le calendrier local utilisé ne contient pas bizarre saut dans le temps, d'autres que l'heure d'été et les secondes intercalaires).
Notez que cela suppose que
date1
etdate2
sont réglés à la même heure de la journée. Pour les différents moments de la journée, vous pensez d'abord à définir ce que "la date de la différence" signifie, comme l'a souligné Jon Skeet.date1.getTime()
vsdate2.getTime()
. Afin de comparaison 2016-03-03 à 2016-03-31 permettra de calculer 27 jours alors que vous voudriez que 28 jours.Math.round()
, qui semble à l'abri dans le "monde réel" des calendriers. Désolé pour le bruit.Prendre un coup d'oeil à Joda Time, ce qui est une amélioration de la Date/Heure API pour Java et devrait fonctionner correctement avec Scala.
Laissez-moi vous montrer la différence entre Joda et de l'Intervalle de Jours:
Si vous avez besoin d'une formaté Chaîne de retour comme
"2 Jours 03h 42m 07s", essayez ceci:
std
ci-dessus n'est pas défini.std
àhrs
), en les comparant à Joda-Time. S'est bien passé, votre code d'accord avec Joda-Time dans chacun de mes cas de test. Mais je continue de recommander à l'encontre de roulement de votre propre date-time library (comme trop risqué, pas un bon usage de votre temps, de nombreuses caractéristiques souhaitables dans Joda-Time comme l'une manipulation aisée des fuseaux horaires).Vérifier exemple ici http://www.roseindia.net/java/beginners/DateDifferent.shtml
Cet exemple vous donner la différence en jours, heures, minutes, secondes et millisecondes sec :).
Utiliser l'heure GMT pour obtenir une instance de l'Agenda, définissez l'heure à l'aide de la méthode du Calendrier de la classe. Le fuseau horaire GMT a 0 offset (pas vraiment important) et de l'heure indicateur a la valeur false.
java.util.Date
etc. En utilisant le hack pour définir le fuseau horaire de GMT rend le code insensible à la casse pour l'heure d'été à effets.Code suivant peut vous donner le résultat désiré:
Date
, de sorte que cette comparaison est le meilleur que peut être réalisé étant donné les circonstances.Meilleure chose à faire est de
Que le nombre est le nombre de millisecondes en une journée.
Une date-autre date vous donne la différence en millisecondes.
Recueillir la réponse dans un double variable.
Remarque: startDate et endDates sont -> java.util.Date
Similaire à jours, vous pouvez également obtenir des heures, des minutes et des secondes
C'est probablement la façon la plus simple de le faire - c'est peut-être parce que j'ai été le codage en Java (avec son certes maladroit, la date et l'heure des bibliothèques) pour un certain temps maintenant, mais que le code est "simple et gentil" de moi!
Êtes-vous heureux avec le résultat retourné en millisecondes, ou d'une partie de votre question que vous préférez l'avoir retourné dans certains autre format?
Pas à l'aide de l'API standard, pas de. Vous pouvez rouler votre propre faire quelque chose comme ceci:
Ou vous pouvez utiliser Joda:
Juste pour répondre à la question initiale:
Placez le code suivant dans une Fonction tout au Long de getAge(){}
Le plus important ici est de travailler avec des numéros longs lorsque la multiplication et la division. Et bien sûr, le décalage que Java s'applique dans son calcul de Dates.
🙂
Puisque la question est taggés avec Scala,
Voici une correcte de Java 7 solution en O(1), sans dépendances.
Après patauger dans tous les autres réponses, pour garder la Java 7 de type Date, mais être plus précis/standard de Java 8 diff approche,
essayez ceci:
vous pouvez modifier la chaîne dans le parse() méthodes param.
Puisque vous êtes à l'aide de la Scala, il y a une très bonne Scala bibliothèque Lamma. Avec Lamma vous pouvez moins jour directement avec
-
opérateurJuste utiliser la méthode ci-dessous avec deux
Date
objets. Si vous souhaitez transmettre le courant de la date, il suffit de passernew Date()
comme deuxième paramètre tel qu'il est initialisé avec le temps actuel.Aussi, en dehors de de nombre de jours, si vous voulez d'autres paramètre de différence aussi, utiliser de l'extrait de code ci-dessous,
P. S Code est entièrement pris d'une SORTE de réponse.
Après avoir lu beaucoup de réponses et de commentaires à cette question, j'ai été laissé avec l'impression que l'on a à utiliser le Joda temps ou bien de prendre en compte certaines particularités avec l'heure d'été etc. Depuis que je ne voulais pas en faire l'un de ces, j'ai fini par écrire quelques lignes de code pour calculer la différence entre deux dates, sans l'aide de la date ou de la durée des classes Java.
Dans le code ci-dessous les chiffres de l'année, le mois et le jour sont les mêmes que dans la vraie vie. Par exemple, dans les 24 décembre 2015, l'année = 2015, le mois = 12 et le jour = 24.
J'ai envie de partager ce code au cas où quelqu'un d'autre veut l'utiliser. Il y a 3 méthodes: 1) Une méthode pour savoir si une année est une année bissextile, 2) Une méthode pour calculer le nombre de jour par rapport au 1er janvier d'une année donnée 3) Une méthode pour calculer le nombre de jours entre deux dates à l'aide de la méthode 2 (numéro de la date de fin du moins de la date de début).
Ici sont les méthodes:
1)
2)
3)
Les versions antérieures de Java que vous pouvez essayer.
La suite est une solution, car il existe de nombreuses façons d'y parvenir:
@Michael Borgwardt réponse en fait ne fonctionne pas correctement dans Android. Les erreurs d'arrondi existent. Exemple 19 au 21 Mai, dit 1 jour, car elle jette 1,99 1. Utilisation ronde avant la conversion en int.
Fixer
Notez que cela fonctionne avec les dates UTC, donc, la différence peut être un jour de congé si vous regardez les dates locales. Et à la faire fonctionner correctement avec les dates locales nécessite une approche totalement différente en raison de l'heure avancée.
Cela donnera à la date de diff pour le jour même ainsi
TimeUnit
Enum classe utilitaire.J'ai aimé le TimeUnit approche fondée sur jusqu'à ce que j'ai trouvé qu'il ne couvre que les cas triviaux où le nombre de combien d'unités d'une timeunit sont dans l'unité supérieure est fixe. Ce en dehors des pauses lorsque vous voulez savoir combien de mois, année, etc sont entre les deux.
voici un comptage approche, pas aussi efficace que certains autres, mais il semble fonctionner pour moi et prend en compte l'heure d'été, trop.
C'est un autre exemple. Qui fonctionne essentiellement par l'utilisateur défini.
dtfObj
qui n'ont pas de déclaration ni affectation. Enfin, en aparté, je vous offre ce conseil: Vous pouvez utiliser la plus généraleMap
interface sur la gauche de votre première ligne plutôt que deLinkedHashMap
. C'est l'un des points/avantages pour le polymorphisme.Il y a un moyen facile de le faire en java
//créer une méthode utilitaire
Cette méthode retourne le nombre de jours entre 2 dates. Soit vous pouvez utiliser la valeur par défaut de java au format de date peut facilement convertir tout format de la date.
Un autre pur Java variation:
grâce à starter code ici: https://stackoverflow.com/a/30207726/2162226
Si vous voulez fixer la question des plages de dates que croix de l'heure d'été limite (par exemple, une date dans l'heure d'été et l'autre en hiver), vous pouvez l'utiliser pour obtenir la différence en jours:
De bonnes nouvelles pour vous.
Il y a un moyen de comment obtenir une différence de jours entre deux dates, sans l'aide d'outils 3ème partie. Pour ce faire, vous devez seulement le tour dates, un jour, à l'aide de java Calendrier de la classe. Il nous suffit alors de caclculate la différence entre deux dates en millisecondes et le diviser par un jour (en millisecondes).
Appelez simplement getTime sur chacun d'eux, la différence, et de diviser par le nombre de millisecondes dans une journée.
Si vous avez d1 et d2 que vos dates, la meilleure solution est probablement la suivante:
puis juste dire
ou quoi que