¿Cómo puedo calcular la edad en Java con precisión? Fecha de nacimiento

Estoy tratando de calcular la edad en Java que las cuentas de meses, por lo que sólo restando años no funcionará. También quiero decirle al usuario si hoy es su cumpleaños. Aquí está el código que tengo hasta ahora, pero me temo que es un poco fuera. También no dirá si hoy es el cumpleaños, aunque las dos fechas que compara son iguales. La forma en que traté de calcular originalmente estaba usando milisegundos. La razón por la que ves 2 maneras de obtener la fecha actual es porque estaba intentando algo para conseguir que funcione, pero quería mostrar a todos mi trabajo para que pudieran señalarme en la dirección correcta.

EDITAR PARA CLARIFICACIÓN lo que quiero decir es 2015-1993 puede ser de 22 años o 21 dependiendo si su cumpleaños ya ha pasado este año. Quiero estar seguro de que tengo la edad correcta con esto en mente.

public class ShowAgeActivity extends AppCompatActivity { private TextView usersAge; private static long daysBetween(Date one, Date two) { long difference = (one.getTime()-two.getTime())/86400000; return Math.abs(difference); } private Date getCurrentForBirthday() { Date birthday = (Date) this.getIntent().getExtras().get("TheBirthDay"); int birthdayYear = birthday.getYear() + 1900; Calendar cal = Calendar.getInstance(); cal.set(birthdayYear, Calendar.MONTH, Calendar.DAY_OF_MONTH); Date current = cal.getTime(); return current; } protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_show_age); Date birthday = (Date) this.getIntent().getExtras().get("TheBirthDay"); Date currentDay = Calendar.getInstance().getTime(); long age = daysBetween(birthday,currentDay)/365; usersAge =(TextView)findViewById(R.id.ageTextView); if (birthday.compareTo(getCurrentForBirthday()) == 0 ) { usersAge.setText("It is your birthday, and your Age is " + String.valueOf(age)); } usersAge.setText("Your Age is " + String.valueOf(age)); } 

}

A continuación se muestra un ejemplo de cómo calcular la edad de una persona, si hoy es su cumpleaños, así como cuántos días quedan hasta su cumpleaños si hoy no es su cumpleaños usando las nuevas clases de paquete java.time que fueron incluidas como parte de Java 8.

  LocalDate today = LocalDate.now(); LocalDate birthday = LocalDate.of(1982, 9, 26); LocalDate thisYearsBirthday = birthday.with(Year.now()); long age = ChronoUnit.YEARS.between(birthday, today); if (thisYearsBirthday.equals(today)) { System.out.println("It is your birthday, and your Age is " + age); } else { long daysUntilBirthday = ChronoUnit.DAYS.between(today, thisYearsBirthday); System.out.println("Your age is " + age + ". " + daysUntilBirthday + " more days until your birthday!"); } 

Este es un código que uso para averiguar qué edad tiene algo.

 Long time= currentDate.getTime / 1000 - birthdate.getTime / 1000 int years = Math.round(time) / 31536000; int months = Math.round(time - years * 31536000) / 2628000; 

La respuesta de Nate es buena. Pero ignora la cuestión de la zona horaria. Y hay un enfoque más explícito posible.

Zona horaria

La zona horaria es crucial para determinar la fecha. Por ejemplo, un nuevo día amanece más temprano en París que en Montreal.

Si se omite, la zona horaria predeterminada actual de la JVM se aplica implícitamente. Le sugiero que en su lugar hagan explícita la zona horaria que espera / desea.

Utilice un nombre de zona horaria adecuado , estilo de continente / ciudad. Nunca utilice los códigos de 3 a 4 letras como "EST" o "IST".

java.time

El framework java.time ( Tutorial ) integrado en Java 8 y posterior incluye la clase Period para representar un lapso de tiempo como un número combinado de años, número de meses y número de días.

Puede consultar un Period para extraer cada uno de esos tres componentes.

El método toString del período genera por defecto una cadena en el formato definido por ISO 8601 , donde un P marca el comienzo seguido de un dígito y una letra tres veces. Por ejemplo, un año y medio: P1Y6M .

 ZoneId zoneId = ZoneId.of( "America/Montreal" ); LocalDate today = LocalDate.now( zoneId ); LocalDate birthdate = LocalDate.of( 1960 , 2 , 17 ); Period p = Period.between( birthdate , today ); String output = p.toString(); Integer age = p.getYears(); Boolean isTodayBirthday = ( (p.getMonths() == 0 ) && ( p.getDays() == 0 ) ); 

Otro método utiliza la clase MonthDay para representar un mes-día sin un año.

 Boolean isBirthdayToday = MonthDay.from( birthdate ) .equals( MonthDay.from( today ) ) ; 

Androide

Para Android, no tienes la tecnología Java 8, como java.time.

Puede buscar algunos proyectos que backport clases java.time. No sé cuán exitosos son.

Además, puede usar la Joda-Time, una biblioteca de terceros que inspiró el marco java.time (JSR 310). El código Joda-Time debe ser similar al anterior. Excepto que la clase Period tiene una resolución más fina, que va a horas, minutos y segundos. Para truncar los datos adicionales, llame al método withTimeAtStartOfDay .

Esto funciona para mí.

 Calendar currentDate = Calendar.getInstance(); SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); Date birthdate = null; try { birthdate = myFormat.parse(yourDate); } catch (ParseException e) { e.printStackTrace(); } Long time= currentDate.getTime().getTime() / 1000 - birthdate.getTime() / 1000; int years = Math.round(time) / 31536000; int months = Math.round(time - years * 31536000) / 2628000; 
  • EPIPE (Broken pipe) durante la carga?
  • Fragmentos y notificaciones: Objetivo diferentes actividades de notificación; Dependiendo de la configuración de la pantalla
  • Android error en tutorial no puede encontrar la variable de símbolo activity_display_message
  • Cómo llamar a un método no estático de un método estático
  • Cómo crear una nueva línea entre dateformat
  • ObjectInputStream - ¿Cómo esperar a nuevos datos?
  • Android eliminar y agregar a ArrayList entre actividades
  • MojoExecutionException: Maven con Android
  • HashMap Alternativas para la Aplicación de Android
  • Eliminar manualmente las actividades de la pila de aplicaciones para Android
  • Cómo cargar imagen a través de matriz de bytes con Glide?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.