Ich möchte ein Alter in Jahren als int in einer Java-Methode zurückgeben. Was ich jetzt habe, ist das Folgende, wo getBirthDate () ein Datumsobjekt zurückgibt (mit dem Geburtsdatum ;-)):
public int getAge() {
long ageInMillis = new Date().getTime() - getBirthDate().getTime();
Date age = new Date(ageInMillis);
return age.getYear();
}
Aber da getYear () veraltet ist, frage ich mich, ob es einen besseren Weg gibt, dies zu tun? Ich bin mir nicht einmal sicher, ob dies richtig funktioniert, da ich (noch) keine Unit-Tests durchgeführt habe.
Antworten:
JDK 8 macht dies einfach und elegant:
Ein JUnit-Test, um seine Verwendung zu demonstrieren:
Jeder sollte jetzt JDK 8 verwenden. Alle früheren Versionen haben das Ende ihres Support-Lebens überschritten.
quelle
null
s überhaupt nicht akzeptieren , sondern verwendenObjects.requireNonNull
.Schauen Sie sich Joda an , das die Datums- / Zeitberechnung vereinfacht (Joda ist auch die Grundlage der neuen Standard-Java-Datums- / Zeit-API, sodass Sie eine baldige Standard-API lernen werden).
EDIT: Java 8 hat etwas sehr ähnliches und ist einen Besuch wert.
z.B
Das ist so einfach wie Sie wollen könnten. Das Pre-Java 8-Zeug ist (wie Sie identifiziert haben) etwas unintuitiv.
quelle
quelle
Moderne Antwort und Übersicht
a) Java-8 (java.time-Paket)
Beachten Sie, dass der Ausdruck
LocalDate.now()
implizit mit der Systemzeitzone zusammenhängt (die von Benutzern häufig übersehen wird). Aus Gründen der Übersichtlichkeit ist es im Allgemeinen besser, die überladene Methode zu verwenden, dienow(ZoneId.of("Europe/Paris"))
eine explizite Zeitzone angibt (hier "Europa / Paris" als Beispiel). Wenn die Systemzeitzone angefordert wird, ist es meine persönliche Präferenz, zu schreibenLocalDate.now(ZoneId.systemDefault())
, um die Beziehung zur Systemzeitzone klarer zu machen. Dies ist mehr Schreibaufwand, erleichtert jedoch das Lesen.b) Joda-Zeit
Bitte beachten Sie, dass die vorgeschlagene und akzeptierte Joda-Time-Lösung ein anderes Berechnungsergebnis für die oben angegebenen Daten liefert (ein seltener Fall), nämlich:
Ich betrachte dies als einen kleinen Fehler, aber das Joda-Team sieht dieses seltsame Verhalten anders und möchte es nicht beheben (seltsam, weil der Tag des Monats des Enddatums kleiner als der des Startdatums ist, also sollte das Jahr sein einer weniger). Siehe auch diese geschlossene Ausgabe .
c) java.util.Calendar usw.
Zum Vergleich siehe die verschiedenen anderen Antworten. Ich würde die Verwendung dieser veralteten Klassen überhaupt nicht empfehlen, da der resultierende Code in einigen exotischen Fällen immer noch fehleranfällig und / oder viel zu komplex ist, wenn man bedenkt, dass die ursprüngliche Frage so einfach klingt. Im Jahr 2015 haben wir wirklich bessere Bibliotheken.
d) Über Date4J:
Die vorgeschlagene Lösung ist einfach, scheitert jedoch manchmal im Falle von Schaltjahren. Nur den Tag des Jahres auszuwerten, ist nicht zuverlässig.
e) Meine eigene Bibliothek Time4J :
Dies funktioniert ähnlich wie bei der Java-8-Lösung. Einfach
LocalDate
nachPlainDate
undChronoUnit.YEARS
nach ersetzenCalendarUnit.YEARS
. Um "heute" zu erhalten, ist jedoch eine explizite Zeitzonenreferenz erforderlich.quelle
LocalDate.now
. Wenn nicht angegeben, wird implizit die aktuelle Standardzeitzone der JVM angewendet. Diese Standardeinstellung kann sich zwischen Maschinen / Betriebssystemen / Einstellungen ändern und kann jederzeit zur Laufzeit durch einen beliebigen Codeaufruf geändert werdensetDefault
. Ich empfehle, spezifisch zu sein, wieLocalDate.now( ZoneId.for( "America/Montreal" ) )
quelle
(birthDate.get(Calendar.DAY_OF_YEAR) - today.get(Calendar.DAY_OF_YEAR) > 3)
? Es scheint sinnlos mit der Existenz der Vergleiche von Monat und Tag des Monats.Wenn Sie GWT verwenden, können Sie nur java.util.Date verwenden. Hier ist eine Methode, die das Datum als Ganzzahl verwendet, aber dennoch java.util.Date verwendet:
quelle
Ich benutze einfach die Millisekunden in einem Jahr konstanten Wert zu meinem Vorteil:
quelle
Die richtige Antwort mit JodaTime lautet:
Sie können es sogar in eine Zeile kürzen, wenn Sie möchten. Ich habe die Idee aus BrianAgnews Antwort kopiert , aber ich glaube, dass dies korrekter ist, wie Sie aus den Kommentaren dort sehen (und es beantwortet die Frage genau).
quelle
Mit der date4j- Bibliothek:
quelle
Dies ist eine verbesserte Version der oben genannten ... wenn man bedenkt, dass das Alter ein "int" sein soll. weil Sie manchmal Ihr Programm nicht mit einer Reihe von Bibliotheken füllen möchten.
quelle
Es ist vielleicht überraschend zu bemerken, dass Sie nicht wissen müssen, wie viele Tage oder Monate es in einem Jahr gibt oder wie viele Tage in diesen Monaten sind. Ebenso müssen Sie nichts über Schaltjahre, Schaltsekunden oder andere wissen von diesem Zeug mit dieser einfachen, 100% genauen Methode:
quelle
Versuchen Sie, diesen in Ihren Code zu kopieren, und verwenden Sie dann die Methode, um das Alter zu ermitteln.
quelle
Ich benutze diesen Code für die Altersberechnung. Ich hoffe, das hilft. Keine Bibliotheken verwendet
quelle
Die Felder Geburt und Wirkung sind beide Datumsfelder:
Dies ist im Grunde eine Modifikation der Lösung von John O ohne Verwendung abgeschriebener Methoden. Ich habe ziemlich viel Zeit damit verbracht, seinen Code in meinem Code zum Laufen zu bringen. Vielleicht spart dies anderen diese Zeit.
quelle
Was ist mit diesem?
quelle
String
dateofbirth
hat das Geburtsdatum. und Format ist was auch immer (in der folgenden Zeile definiert):So formatieren Sie:
Variable
ageStr
wird die Jahre haben.quelle
Elegant, scheinbar korrekt , auf Zeitstempeldifferenzen basierende Variante der Yaron Ronen-Lösung.
Ich füge einen Komponententest hinzu, um zu beweisen, wann und warum er nicht korrekt ist . Es ist aufgrund (möglicherweise) unterschiedlicher Anzahl von Schalttagen (und Sekunden) in einem Zeitstempeldifferenz unmöglich. Die Diskrepanz sollte für diesen Algorithmus maximal + -1 Tag (und eine Sekunde) betragen, siehe test2 (), während die Yaron Ronen-Lösung auf einer vollständig konstanten Annahme von basiert
timeDiff / MILLI_SECONDS_YEAR
für einen 40-Jährigen 10 Tage abweichen kann, diese Variante jedoch auch falsch ist.Dies ist schwierig, da diese verbesserte Variante unter Verwendung der Formel die
diffAsCalendar.get(Calendar.YEAR) - 1970
meiste Zeit korrekte Ergebnisse liefert, da die Anzahl der Schaltjahre im Durchschnitt zwischen zwei Daten gleich ist.quelle
quelle
quelle
Hier ist der Java-Code zur Berechnung des Alters in Jahr, Monat und Tagen.
quelle
Einfachster Weg ohne Bibliotheken:
quelle
ChronoUnit.YEARS.between( LocalDate.of( 1968 , Month.MARCH , 23 ) , LocalDate.now() )
. Siehe richtige AntwortDateUtils
ist eine BibliothekMit Java 8 können wir das Alter einer Person mit einer Codezeile berechnen:
quelle
Ich schätze alle richtigen Antworten, aber dies ist die Kotlin-Antwort auf dieselbe Frage
Ich hoffe, wäre hilfreich für Kotlin-Entwickler
quelle
quelle
quelle
quelle
quelle
quelle