A continuación os mostramos cómo calcular la edad de una persona a partir de su fecha de nacimiento en distintas versiones de java.

Cómo calcular la edad de una persona a partir de su fecha de nacimiento en Java 8

El API de Java 8 es muy útil para calcular esta operación. Bastaría con usar la operación between de la clase Period del siguiente modo:

Period edad = Period.between(LocalDate.of(1987, 4, 8), LocalDate.now());
System.out.println(String.format("%d años, %d meses y %d días",
        edad.getYears(),
        edad.getMonths(),
        edad.getDays()));

En el ejemplo anterior, he creado directamente la fecha origen a partir del método factoría LocalDate.of, pero si la fecha de nacimiento viniera, por ejemplo, como un String por ser la entrada de un formulario, podríamos crearla del siguiente modo:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate fechaNacimiento = LocalDate.parse("08/04/1987", formatter);
Period edad = Period.between(fechaNacimiento, LocalDate.now());
System.out.println(String.format("%d años, %d meses y %d días",
        edad.getYears(),
        edad.getMonths(),
        edad.getDays()));

A diferencia de otros formatters en versiones anteriores de Java, el DateTimeFormatter es thread-safe, por lo que podemos utilizarlo en entornos multi-hilo y aplicaciones web sin riesgo alguno.

Como hemos visto en los ejemplos anteriores, el cálculo de la edad a partir de la fecha de nacimiento en Java 8 es muy sencillo y rápido. A continuación mostraré como hacer un cálculo similar en versiones anteriores.

Cómo calcular la edad de una persona a partir de su fecha de nacimiento en Java 6 / 7

A diferencia del código anterior, en Java 6 o 7 no disponemos de la clase Period y sus métodos utilidad. Pero podemos hacer un cálculo manual de un modo similar para llegar a la misma solución:

Calendar fechaNacimiento = new GregorianCalendar(1987, 3, 8);
Calendar ahora = Calendar.getInstance();

long edadEnDias = (ahora.getTimeInMillis() - fechaNacimiento.getTimeInMillis()) 
                        / 1000 / 60 / 60 / 24;

int anos = Double.valueOf(edadEnDias / 365.25d).intValue();
int dias = Double.valueOf(edadEnDias % 365.25d).intValue();

System.out.println(String.format("%d años y %d días", anos, dias));

El hecho de usar 365.25d como elemento para realizar los cálculos se debe a los años bisiestos (1 día cada 4 años implica 0.25d por año). No se trata de un cálculo exacto pero el margen de error puede ser de un día precisamente por este caso.

Mi recomendación es, sin duda, intentar migrarte a versiones de Java 8 o superiores para aprovechar la potencia de las nuevas APIs.