Je veux renvoyer un âge en années en tant qu'int dans une méthode Java. Ce que j'ai maintenant est le suivant où getBirthDate () renvoie un objet Date (avec la date de naissance ;-)):
public int getAge() {
long ageInMillis = new Date().getTime() - getBirthDate().getTime();
Date age = new Date(ageInMillis);
return age.getYear();
}
Mais comme getYear () est obsolète, je me demande s'il existe un meilleur moyen de le faire? Je ne suis même pas sûr que cela fonctionne correctement, car je n'ai pas (encore) de tests unitaires en place.
Réponses:
JDK 8 rend cela simple et élégant:
Un test JUnit pour démontrer son utilisation:
Tout le monde devrait maintenant utiliser JDK 8. Toutes les versions antérieures ont dépassé la fin de leur durée de vie de support.
la source
null
de tout, mais au lieu d' utiliserObjects.requireNonNull
.Découvrez Joda , qui simplifie les calculs de date / heure (Joda est également la base des nouvelles API de date / heure standard de Java, vous apprendrez donc une API bientôt standard).
EDIT: Java 8 a quelque chose de très similaire et vaut le détour.
par exemple
ce qui est aussi simple que vous le souhaitez. Les éléments pré-Java 8 sont (comme vous l'avez identifiés) quelque peu peu intuitifs.
la source
la source
Réponse moderne et vue d'ensemble
a) Java-8 (package java.time)
Notez que l'expression
LocalDate.now()
est implicitement liée au fuseau horaire du système (qui est souvent négligé par les utilisateurs). Pour plus de clarté, il est généralement préférable d'utiliser la méthode surchargée ennow(ZoneId.of("Europe/Paris"))
spécifiant un fuseau horaire explicite (ici "Europe / Paris" par exemple). Si le fuseau horaire du système est demandé, ma préférence personnelle est d'écrireLocalDate.now(ZoneId.systemDefault())
pour rendre la relation avec le fuseau horaire du système plus claire. C'est plus d'effort d'écriture, mais cela facilite la lecture.b) Joda-Time
Veuillez noter que la solution Joda-Time proposée et acceptée donne un résultat de calcul différent pour les dates indiquées ci-dessus (un cas rare), à savoir:
Je considère cela comme un petit bug mais l'équipe Joda a un point de vue différent sur ce comportement étrange et ne veut pas le corriger (bizarre parce que le jour du mois de la date de fin est plus petit que la date de début, donc l'année devrait être un de moins). Voir aussi cette fermeture question .
c) java.util.Calendar etc.
Pour comparaison, voir les diverses autres réponses. Je ne recommanderais pas du tout d'utiliser ces classes obsolètes car le code résultant est toujours sujet aux erreurs dans certains cas exotiques et / ou bien trop complexe compte tenu du fait que la question d'origine semble si simple. En 2015, nous avons de meilleures bibliothèques.
d) À propos de Date4J:
La solution proposée est simple mais échouera parfois en cas d'années bissextiles. Evaluer simplement le jour de l'année n'est pas fiable.
e) Ma propre bibliothèque Time4J :
Cela fonctionne de la même manière que Java-8-solution. Remplacez simplement
LocalDate
parPlainDate
etChronoUnit.YEARS
parCalendarUnit.YEARS
. Cependant, obtenir «aujourd'hui» nécessite une référence de fuseau horaire explicite.la source
LocalDate.now
. Si omis, le fuseau horaire par défaut actuel de la machine virtuelle Java est appliqué implicitement. Cette valeur par défaut peut changer entre les machines / OS / paramètres, et peut également à tout moment pendant l'exécution par n'importe quel appel de codesetDefault
. Je recommande d'être précis, commeLocalDate.now( ZoneId.for( "America/Montreal" ) )
la source
(birthDate.get(Calendar.DAY_OF_YEAR) - today.get(Calendar.DAY_OF_YEAR) > 3)
? Cela semble inutile avec l'existence de comparaisons de mois et de jour de mois.J'utilise simplement les millisecondes dans une valeur constante d'un an à mon avantage:
la source
Si vous utilisez GWT, vous serez limité à l'utilisation de java.util.Date, voici une méthode qui prend la date sous forme d'entiers, mais utilise toujours java.util.Date:
la source
La bonne réponse en utilisant JodaTime est:
Vous pouvez même le raccourcir en une seule ligne si vous le souhaitez. J'ai copié l'idée de la réponse de BrianAgnew , mais je pense que c'est plus correct comme vous le voyez dans les commentaires (et cela répond exactement à la question).
la source
Avec la bibliothèque date4j :
la source
Ceci est une version améliorée de celle ci-dessus ... considérant que vous voulez que l'âge soit un «int». parce que parfois vous ne voulez pas remplir votre programme avec un tas de bibliothèques.
la source
Il est peut-être surprenant de noter que vous n'avez pas besoin de savoir combien de jours ou de mois il y a dans une année ou combien de jours il y a dans ces mois, de même, vous n'avez pas besoin de connaître les années bissextiles, les secondes intercalaires ou tout autre de ces choses en utilisant cette méthode simple et précise à 100%:
la source
Essayez de copier celui-ci dans votre code, puis utilisez la méthode pour obtenir l'âge.
la source
J'utilise ce morceau de code pour le calcul de l'âge, j'espère que cela aide .. aucune bibliothèque utilisée
la source
Les champs naissance et effet sont tous deux des champs de date:
Il s'agit essentiellement d'une modification de la solution de John O sans utiliser de méthodes dépréciées. J'ai passé pas mal de temps à essayer de faire fonctionner son code dans mon code. Peut-être que cela en sauvera d'autres cette fois.
la source
Et celui-là?
la source
String
dateofbirth
a la date de naissance. et le format est n'importe quel (défini dans la ligne suivante):Voici comment formater:
La variable
ageStr
aura les années.la source
Variante élégante, apparemment correcte , basée sur la différence d'horodatage de la solution Yaron Ronen.
J'inclus un test unitaire pour prouver quand et pourquoi il n'est pas correct . Cela est impossible en raison (éventuellement) d'un nombre différent de jours bissextiles (et de secondes) dans une différence d'horodatage. L'écart devrait être max + -1 jour (et une seconde) pour cet algorithme, voir test2 (), alors que la solution de Yaron Ronen basée sur une hypothèse complètement constante de
timeDiff / MILLI_SECONDS_YEAR
peut différer de 10 jours pour un 40 ans, néanmoins cette variante est également incorrecte.C'est délicat, car cette variante améliorée, utilisant une formule
diffAsCalendar.get(Calendar.YEAR) - 1970
, renvoie des résultats corrects la plupart du temps, car le nombre d'années bissextiles est en moyenne le même entre deux dates.la source
la source
la source
Voici le code java pour calculer l'âge en année, mois et jours.
la source
Le moyen le plus simple sans aucune bibliothèque:
la source
ChronoUnit.YEARS.between( LocalDate.of( 1968 , Month.MARCH , 23 ) , LocalDate.now() )
. Voir la bonne réponseDateUtils
est une bibliothèqueAvec Java 8, nous pouvons calculer l'âge d'une personne avec une ligne de code:
la source
la source
la source
la source
la source
la source
J'apprécie toutes les réponses correctes mais c'est la réponse kotlin pour la même question
J'espère que cela serait utile aux développeurs de kotlin
la source