Différence en jours entre deux dates en Java?
J'ai besoin de trouver la nombre de jours entre deux dates: l'un est à partir d'un rapport et un est la date actuelle. Mon extrait de:
int age=calculateDifference(agingDate, today);
Ici calculateDifference
est une méthode privée, agingDate
et today
sont Date
des objets, pour vos éclaircissements. J'ai suivi deux articles à partir d'un Java forum, Thread 1 /Thread 2.
Il fonctionne très bien dans un programme autonome bien que quand je l'ai dans ma logique à lire dans le rapport que j'obtiens une inhabituelle différence dans les valeurs.
Pourquoi est-ce qui se passe et comment puis-je résoudre ce problème?
EDIT :
Que je suis un plus grand nombre de jours par rapport à la quantité réelle de Jours.
public static int calculateDifference(Date a, Date b)
{
int tempDifference = 0;
int difference = 0;
Calendar earlier = Calendar.getInstance();
Calendar later = Calendar.getInstance();
if (a.compareTo(b) < 0)
{
earlier.setTime(a);
later.setTime(b);
}
else
{
earlier.setTime(b);
later.setTime(a);
}
while (earlier.get(Calendar.YEAR) != later.get(Calendar.YEAR))
{
tempDifference = 365 * (later.get(Calendar.YEAR) - earlier.get(Calendar.YEAR));
difference += tempDifference;
earlier.add(Calendar.DAY_OF_YEAR, tempDifference);
}
if (earlier.get(Calendar.DAY_OF_YEAR) != later.get(Calendar.DAY_OF_YEAR))
{
tempDifference = later.get(Calendar.DAY_OF_YEAR) - earlier.get(Calendar.DAY_OF_YEAR);
difference += tempDifference;
earlier.add(Calendar.DAY_OF_YEAR, tempDifference);
}
return difference;
}
Remarque :
Malheureusement, aucune de ces réponses m'ont aidé à résoudre le problème. J'ai accompli ce problème avec l'aide de Joda-time bibliothèque.
- Qu'entendez-vous par inhabituelle valeurs de la différence? Pourriez-vous être plus explicite s'il vous plaît, ou de donner un exemple de quelque sorte?
- Ajouter Votre code, veuillez
- Pouvez-vous poster le code pour calculateDifference méthode?
- Pour info, le gênants de longue date du temps des classes comme
java.util.Date
,java.util.Calendar
, etjava.text.SimpleDateFormat
sont maintenant héritage, supplantée par la java.de temps les classes. Voir Tutoriel Oracle. De même, le Joda-Time le projet est maintenant dans mode de maintenance, avec l'équipe conseiller de la migration à la java.les classes de temps.
Vous devez vous connecter pour publier un commentaire.
Je vous suggère d'utiliser l'excellent Joda Time de la bibliothèque au lieu de l'imparfait de java.util.Date et amis. Vous pouvez simplement écrire
J'ai peut-être trop tard pour rejoindre le jeu, mais ce que le diable, hein? 🙂
Vous pensez que c'est un problème thread? Comment utilisez-vous la sortie de cette méthode, par exemple? OU
Pouvons-nous changer votre code pour faire quelque chose d'aussi simple que:
La diff /(24 * etc) ne prend pas de Fuseau horaire en compte, donc si votre fuseau horaire par défaut a une heure d'été, il peut lancer le calcul off.
Ce lien a une jolie petite mise en œuvre.
Ici est la source du lien ci-dessus dans le cas où le lien est en bas:
et
while
devrait être.while (cursor.getTimeInMillis() <= endInstant);
Sinon vous obtiendrez une boucle infinie si moins d'une journée.java.temps
Dans Java 8 et les versions ultérieures, utilisez le java.cadre de temps (Tutoriel).
Duration
La
Durée
classe représente un laps de temps qu'un certain nombre de secondes en plus d'une fraction de seconde. Il peut compter les jours, les heures, les minutes et les secondes.ChronoUnit
Si tous vous avez besoin est le nombre de jours, alternativement, vous pouvez utiliser le
ChronoUnit
enum. Avis les méthodes de calcul de retour d'unlong
plutôt queint
.Cela dépend de ce que vous définissez comme la différence. Pour comparer deux dates à minuit, vous pouvez le faire.
Solution à l'aide de la différence entre les millisecondes de temps, avec arrondi correct de l'heure d'été dates:
Une remarque: bien sûr, les dates doivent être dans une certaine fuseau horaire.
Le code important:
Si vous ne voulez pas rond, vous pouvez utiliser UTC dates,
Illustration du problème: (Mon code est le calcul de delta, dans les prochaines semaines, mais le même problème s'applique avec delta jours)
Ici est très raisonnable-à la recherche de la mise en œuvre:
Mais ce test échoue:
La raison est la suivante:
mais ceux qui cherchent à un calendrier serait d'accord que la réponse est 2.
J'utilise cette fonction:
ma fonction:
Regarder la getFragmentInDays méthodes dans cet apache commons-lang classe
DateUtils
.Basé sur @Mad_Troll réponse, j'ai développé cette méthode.
J'ai couru à propos de 30 cas de test contre elle, est la seule méthode qui gère sous le temps de la journée fragments correctement.
Exemple: Si vous passez maintenant & maintenant + 1 milliseconde, c'est toujours le même jour.
Faire
1-1-13 23:59:59.098
à1-1-13 23:59:59.099
retourne 0 jours, correctement; attribuer des autres méthodes posté ici ne pas le faire correctement.Intéressant de noter qu'il ne se soucie pas de la façon dont vous les mettez dans, Si votre date de fin qui est avant la date de votre départ, il va compter à rebours.
Vous pouvez supprimer le
@NotNull
annotations, ces données sont utilisées par l'Ide de faire de l'analyse de code à la voléeVous dire qu'il fonctionne très bien dans un programme autonome", mais que vous obtenez "insolite valeurs de la différence" quand vous "dans ma logique à lire à partir d'un rapport". Qui suggère que votre rapport a certaines valeurs qui ne fonctionne pas bien, et votre programme autonome ne contient pas ces valeurs. Au lieu d'un programme autonome, je vous propose un cas de test. Écrire un scénario de test comme vous le feriez un programme autonome, sous-classement de JUnit du cas de test de la classe. Maintenant, vous pouvez exécuter une très spécifiques, par exemple, de savoir quelle est la valeur que vous attendez (et ne pas donner aujourd'hui pour le test de la valeur, car aujourd'hui les changements au fil du temps). Si vous mettez dans les valeurs que vous avez utilisé dans le programme autonome, vos tests seront probablement passer. Que du bon, vous voulez que ces cas de continuer à travailler. Maintenant, ajouter une valeur à partir de votre rapport, qui ne fonctionne pas bien. Votre nouveau test sera probablement voués à l'échec. Comprendre pourquoi ça ne fonctionne pas, le réparer, et arriver au vert (tous les tests de passage). Exécuter votre rapport. Voir ce qui est toujours en panne; écrire un test; le faire passer. Bientôt vous trouverez votre rapport de travail.
Centaine de lignes de code pour cette fonction de base???
Juste une méthode simple:
ThreeTen-Extra
La Réponse par Vitalii Fedorenko est correct, décrivant la manière d'effectuer ce calcul de façon moderne avec java.le temps classes (
Durée
&ChronoUnit
) intégré dans Java 8 et plus tard (et dos-porté à Java 6 & 7 et pour Android).Days
Si vous êtes en utilisant un certain nombre de jours régulièrement dans votre code, vous pouvez le remplacer de simples entiers avec l'utilisation d'une classe. Le
Jours
classe peut être trouvé dans la ThreeTen-Extra projet, une extension de java.de temps et de terrain d'essai pour de possibles futurs ajouts à java.temps. LeDays
classe fournit un moyen sûr de représenter un nombre de jours de votre demande. La classe comprend la pratique des constantes pourZÉRO
etON
.Compte tenu de la vieille désuet
java.util.Date
objets dans la Question, d'abord les convertir modernejava.temps.Instantané
objets. La vieille date-heure classes ont récemment ajouté des méthodes pour faciliter la conversion de java.le temps, tel unjava.util.Date: toInstant
.Passer les deux
Instant
objets à l'usine méthode pourorg.threeten.supplémentaire.Jours
.Dans l'implémentation actuelle (2016-06) c'est un wrapper appel
java.temps.temporelle.ChronoUnit.JOURS.entre
, lire laChronoUnit
classe doc pour plus de détails. Pour être clair: tout en majusculesDAYS
est dans l'enumChronoUnit
alors que les premières-capDays
est une classe de ThreeTen-Extra.Vous pouvez passer ces
Days
les objets autour de votre propre code. Vous pouvez sérialiser à une Chaîne dans la norme ISO 8601 format en appelanttoString
. Ce format dePnD
utilise unP
pour marquer le début etD
signifie “jours”, avec un nombre de jours entre les deux. Les deux java.les classes de temps et ThreeTen-Extra utiliser ces formats standard par défaut lors de la génération et l'analyse des Chaînes de caractères représentant la date valeurs de temps.Ce code calcule jours entre 2 Chaînes date:
Si vous êtes à la recherche d'une solution qui renvoie un nombre ou de jours entre par exemple
11/30/2014 23:59
et12/01/2014 00:01
voici la solution à l'aide de Joda Time.Cette mise en œuvre sera de retour
1
comme une différence en jours. La plupart des solutions posté ici calculer la différence en millisecondes entre deux dates. Cela signifie que0
serait retourné parce qu'il y a seulement 2 minutes de différence entre ces deux dates.Je l'ai déjà écrit à ce sujet. C'est un repost de Le calcul de la différence entre Java deux occurrences de date.
java.util.Date
,java.util.Calendar
, etjava.text.SimpleDateFormat
sont maintenant héritage, supplantée par la java.de temps les classes. Voir Tutoriel Oracle.Vous devez utiliser Joda Time library parce que Java Util Date renvoie des valeurs erronées parfois.
Joda vs Java Util Date
Par exemple les jours entre hier (jj-mm-aaaa, 12-07-2016) et le premier jour de l'année 1957 (jj-mm-aaaa, 01-01-1957):
Donc j'ai vraiment des conseils vous de faire usage de Joda Time library.
J'ai fait de cette façon. c'est facile 🙂