Ajoutez année à Java Calendrier ne fonctionne pas
Merci de m'éclairer sur ce point :
J'essaye simplement d'ajouter de 10 ans à la date actuelle, puis de soustraire une date d'expiration pour retourner le nombre d'années:
public int getMaxYears() {
int max = 0;
Calendar ten_year_later = Calendar.getInstance();
ten_year_later.setTime(new Date());
ten_year_later.add(Calendar.YEAR, 10);
Calendar expiration = Calendar.getInstance();
expiration.setTime(expiration_date);
max = (int) (ten_year_later.getTimeInMillis() - expiration.getTimeInMillis())/(365 * 24 * 60 * 60 * 1000);
return max;
}
Quand je debug cela, le calendrier de toujours rester au courant de l'année.
Quelqu'un ?
Quel calendrier? ten_year_later ou de l'expiration?
Tomblin : ten_year_later ... je vais modifier la question.
Aussi: une année n'est pas 365 jours, il a en compte les années bissextiles. Pour des calculs, 365.25 fonctionne, mais pour de vrai calculs que vous avez besoin de quelque chose qui connaît les règles ... comme Calendrier.
Je sais. Merci, mais ce n'est pas la question.
Je vous recommande d'utiliser le JodaTime de la bibliothèque pour tous de votre date de calcul des besoins.
Tomblin : ten_year_later ... je vais modifier la question.
Aussi: une année n'est pas 365 jours, il a en compte les années bissextiles. Pour des calculs, 365.25 fonctionne, mais pour de vrai calculs que vous avez besoin de quelque chose qui connaît les règles ... comme Calendrier.
Je sais. Merci, mais ce n'est pas la question.
Je vous recommande d'utiliser le JodaTime de la bibliothèque pour tous de votre date de calcul des besoins.
OriginalL'auteur codea | 2010-10-07
Vous devez vous connecter pour publier un commentaire.
Vous avez un problème avec int /long de conversion: 365 * 24 * 60 * 60 * 1000
Qui évalue à 31536000000 et est donc supérieur à
Integer.MAX_VALUE
2147483647Cela fonctionne:
À droite sur la! Merci!!!!
OriginalL'auteur stacker
Votre calcul de
max
est faux. Unint
ne peut pas tenir une année dans millis.Plutôt le remplacer par
Ou mieux, utiliser JodaTime:
Voir mon commentaire sur bac de réception de la réponse.
+1 je suis entièrement d'accord qu'il devrait être calculé comme vous l'avez souligné.
+1 pour la mention de Joda Time!
OriginalL'auteur BalusC
Voici un exemple simple de ce que devrait fonctionner.
Juste se rappeler d'utiliser un long temps pour obtenir le temps en millisecondes!
OriginalL'auteur Bryan James
Calendrier est paresseux, il pourrait ne pas recalculer tous les autres champs jusqu'à ce que vous les demandez. C'est me jeté hors dans le débogueur avant. Qu'advient-il si vous
System.out.println(ten_year_later);
?getTimeInMillis()
devrait déjà avoir mis à jour les champs -comme tous les autresget
méthode deCalendar
.Même si je l'appelle ten_year_later.getTimeInMillis() ? max est toujours 0 provoquer la expiration_date après qu'aujourd'hui.
Non, je parlais de ce que vous voyez dans le débogueur avant d'appeler getTimeInMillis().
OriginalL'auteur Paul Tomblin
Je l'ai mentionné dans un commentaire que vous avez un mauvais calcul pour le nombre de millis dans l'année (passons sur l'int/long de l'émission).
Puisque vous avez deux calendriers, chacun de qui peut garder une année, pourquoi ne pas écrire votre code comme celui-ci (non compilé, peuvent contenir des fautes de frappe):
En supposant que ce que vous voulez vraiment ...
OriginalL'auteur Anon
Le nombre de millisecondes dans une année qui est bien en dehors de la plage d'un int, donc, à la fois l'int casting de
ten_year_later.getTimeInMillis() - expiration.getTimeInMillis()
et le calcul365 * 24 * 60 * 60 * 1000
donnera des valeurs incorrectes.La
ten_year_later
doit être correcte. Il n'est pas nécessaire d'invoquer computeFields R. Bemrose écrit.OriginalL'auteur jarnbjo