Quiero devolver una edad en años como int en un método Java. Lo que tengo ahora es lo siguiente donde getBirthDate () devuelve un objeto Date (con la fecha de nacimiento ;-)):
public int getAge() {
long ageInMillis = new Date().getTime() - getBirthDate().getTime();
Date age = new Date(ageInMillis);
return age.getYear();
}
Pero dado que getYear () está en desuso, me pregunto si hay una mejor manera de hacer esto. Ni siquiera estoy seguro de que esto funcione correctamente, ya que no tengo pruebas unitarias en su lugar (todavía).
Respuestas:
JDK 8 hace esto fácil y elegante:
Una prueba JUnit para demostrar su uso:
Todos deberían estar usando JDK 8 por ahora. Todas las versiones anteriores han pasado el final de sus vidas de soporte.
fuente
null
s en absoluto, sino usarloObjects.requireNonNull
.Eche un vistazo a Joda , que simplifica los cálculos de fecha / hora (Joda también es la base de la nueva API estándar de fecha / hora de Java, por lo que aprenderá una API que pronto será estándar).
EDITAR: Java 8 tiene algo muy similar y vale la pena echarle un vistazo.
p.ej
que es tan simple como podrías desear. El material anterior a Java 8 es (como ha identificado) algo poco intuitivo.
fuente
fuente
Respuesta moderna y resumen
a) Java-8 (java.time-package)
Tenga en cuenta que la expresión
LocalDate.now()
está implícitamente relacionada con la zona horaria del sistema (que a menudo los usuarios pasan por alto). Para mayor claridad, generalmente es mejor usar el método sobrecargado quenow(ZoneId.of("Europe/Paris"))
especifica una zona horaria explícita (aquí "Europa / París" como ejemplo). Si se solicita la zona horaria del sistema, mi preferencia personal es escribirLocalDate.now(ZoneId.systemDefault())
para aclarar la relación con la zona horaria del sistema. Esto es más esfuerzo de escritura pero facilita la lectura.b) Joda-Time
Tenga en cuenta que la solución Joda-Time propuesta y aceptada produce un resultado de cálculo diferente para las fechas mostradas anteriormente (un caso raro), a saber:
Considero esto como un pequeño error, pero el equipo de Joda tiene una opinión diferente sobre este comportamiento extraño y no quiere solucionarlo (extraño porque el día del mes de la fecha de finalización es menor que el de la fecha de inicio, por lo que el año debería ser uno menos). Ver también este tema cerrado .
c) java.util.Calendar etc.
Para comparar, vea las otras respuestas. No recomendaría usar estas clases desactualizadas porque el código resultante todavía es propenso a errores en algunos casos exóticos y / o es demasiado complejo considerando el hecho de que la pregunta original suena muy simple. En el año 2015 tenemos bibliotecas realmente mejores.
d) Acerca de Date4J:
La solución propuesta es simple pero a veces fallará en caso de años bisiestos. Solo evaluar el día del año no es confiable.
e) Mi propia biblioteca Time4J :
Esto funciona de manera similar a la solución Java-8. Simplemente reemplace
LocalDate
porPlainDate
yChronoUnit.YEARS
porCalendarUnit.YEARS
. Sin embargo, obtener "hoy" requiere una referencia explícita de zona horaria.fuente
LocalDate.now
. Si se omite, la zona horaria predeterminada actual de la JVM se aplica implícitamente. Ese valor predeterminado puede cambiar entre máquinas / SO / configuraciones, y también puede hacerlo en cualquier momento durante el tiempo de ejecución mediante cualquier llamada de códigosetDefault
. Recomiendo ser específico, comoLocalDate.now( ZoneId.for( "America/Montreal" ) )
fuente
(birthDate.get(Calendar.DAY_OF_YEAR) - today.get(Calendar.DAY_OF_YEAR) > 3)
? Parece inútil con la existencia de las comparaciones de mes y día de mes.Simplemente utilizo el valor constante de milisegundos en un año para mi ventaja:
fuente
Si está utilizando GWT, estará limitado a usar java.util.Date, aquí hay un método que toma la fecha como enteros, pero aún usa java.util.Date:
fuente
La respuesta correcta usando JodaTime es:
Incluso podría acortarlo en una línea si lo desea. Copié la idea de la respuesta de BrianAgnew , pero creo que esto es más correcto como se ve en los comentarios allí (y responde la pregunta exactamente).
fuente
Con la biblioteca date4j :
fuente
Esta es una versión mejorada de la anterior ... teniendo en cuenta que desea que la edad sea un 'int'. porque a veces no quieres llenar tu programa con un montón de bibliotecas.
fuente
Quizás sea sorprendente notar que no necesita saber cuántos días o meses hay en un año o cuántos días hay en esos meses, del mismo modo, no necesita saber acerca de los años bisiestos, los segundos bisiestos o cualquier otro de esas cosas usando este método simple y 100% preciso:
fuente
Intente copiar este en su código, luego use el método para obtener la edad.
fuente
Uso este código para calcular la edad, espero que esto ayude ... no se usan bibliotecas
fuente
Los campos nacimiento y efecto son ambos campos de fecha:
Esto básicamente es una modificación de la solución de John O sin usar métodos depreciados. Pasé bastante tiempo intentando que su código funcionara en mi código. Quizás esto salvará a otros ese tiempo.
fuente
¿Qué hay de este?
fuente
String
dateofbirth
Tiene la fecha de nacimiento. y el formato es lo que sea (definido en la siguiente línea):Aquí es cómo formatear:
Variable
ageStr
tendrá los años.fuente
Elegante, aparentemente correcta , variante basada en la diferencia de marca de tiempo de la solución de Yaron Ronen.
Incluyo una prueba unitaria para probar cuándo y por qué no es correcta . Es imposible debido (posiblemente) a un número diferente de días bisiestos (y segundos) en cualquier diferencia de marca de tiempo. La discrepancia debe ser max + -1 día (y un segundo) para este algoritmo, ver test2 (), mientras que la solución de Yaron Ronen basada en la suposición completamente constante de
timeDiff / MILLI_SECONDS_YEAR
puede diferir 10 días para un hombre de 40 años, sin embargo, esta variante también es incorrecta.Es complicado, porque esta variante mejorada, usando la fórmula
diffAsCalendar.get(Calendar.YEAR) - 1970
, devuelve resultados correctos la mayor parte del tiempo, como número de años bisiestos en promedio igual entre dos fechas.fuente
fuente
fuente
Aquí está el código de Java para calcular la edad en año, mes y días.
fuente
La forma más fácil sin bibliotecas:
fuente
ChronoUnit.YEARS.between( LocalDate.of( 1968 , Month.MARCH , 23 ) , LocalDate.now() )
. Ver respuesta correctaDateUtils
es una bibliotecaCon Java 8, podemos calcular la edad de una persona con una línea de código:
fuente
fuente
fuente
fuente
fuente
fuente
Agradezco todas las respuestas correctas, pero esta es la respuesta de Kotlin para la misma pregunta.
Espero que sea útil para los desarrolladores de Kotlin
fuente