Como faço para converter data em idade na jsp?

Boa tarde, estou fazendo um sistema onde cadastro o usuário como sendo aluno ou professor, um dos campos que estou a gerar é nascimento_usuario, utilizei um meio de conversões, como no código abaixo:

package br.com.spe.util;

import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

// Fazendo a formatação da variável de tipo String para tipo Date.

public class Conversoes {

                    public static Date converterData(String data) {
                                try {
                                    DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
                                            if (data != null || !data.trim().equals("")) {
                                                return fmt.parse(data); }
                                            else {
                                                return null; }
                                }
                                catch (Exception ex) {
                                    System.out.println("Problemas ao converter data! \n Erro: " + ex.getMessage());
                                    ex.printStackTrace();
                                    return null; }
                    }

}

Acontece que na hora de listar os usuários para ver os dados, gostaria que no lugar da data listasse a idade, apenas na jsp. Na minha tela de listagem vai o seguinte código:

                <table id="tabela" align="center" class="table table-hover">
                    <thead>   
                    <th>ID</th>
                    <th>Tipo</th>
                    <th>Nome</th>
                    <th>Idade</th>
                    <th>CPF</th>
                    <th>RG</th>
                    <th>RM</th>
                    <th>E-mail</th>
                    <th>Status</th>
                    </thead>
                    <tbody>
                        <c:forEach items="${listarUsuario}" var="usuario">
                            <tr>
                                <td> ${usuario.idUsuario} </td>
                                <td> ${usuario.tipoUsuario} </td>
                                <td> ${usuario.nomeUsuario} </td>
                                <td> ${usuario.nascimentoUsuario} </td>
                                <td> ${usuario.cpfUsuario} </td>
                                <td> ${usuario.rgUsuario} </td>
                                <td> ${usuario.rmUsuario} </td>
                                <td> ${usuario.loginUsuario} </td>
                                <td> ${usuario.statusUsuario ? 'Ativo' : 'Inativo'} </td>

                                <!-- Opção para alterar dados do usuário -->
                                <td><a href="${pageContext.request.contextPath}/CarregarUsuario?idUsuario=${usuario.idUsuario}"> Alterar</a></td>

                                <!-- Opção para inativar o usuário -->
                                <td><a href="${pageContext.request.contextPath}/InativarUsuario?idUsuario=${usuario.idUsuario}"> Inativar</a></td>

                            </tr>
                        </c:forEach>
                    </tbody>
                </table>

Alguém poderia me ajudar a fazer uma conversão para idade, do jeito mais simples possível?

Se você usa banco de dados, você pode fazer a operação direta do banco.

Eu faria uma formatação para idade dentro da class Usuario, tipo

 public int getNascimentoToIdade(Date data){
	 int anos = data.getYear();
	 return LocalDate.now().getYear()-anos;
 } 

Agradeço sua sugestão, mas acontece que não posso alterar no banco pois a mesma data será utilizada em outro momento, se alterar lá muda em tudo…

Olá, obrigado pela sugestão dada, infelizmente não tenho muita experiência nessa parte de formatação dentro de classe, e gostaria de fazer o processo utilizando o próprio atributo nascimentoUsuario. Será que poderia me ajudar com isso, por gentileza? O código da minha classe está da seguinte maneira:

package br.com.spe.model;

import java.util.Date;

public class Usuario {
private Integer idUsuario;
private String tipoUsuario;
private String nomeUsuario;
private Date nascimentoUsuario;
private String cpfUsuario;
private String rgUsuario;
private String rmUsuario;
private String loginUsuario;
private String senhaUsuario;
private Boolean statusUsuario;

public Usuario() {
}

public Usuario(Integer idUsuario, String tipoUsuario, String nomeUsuario, Date nascimentoUsuario, String cpfUsuario, String rgUsuario, String rmUsuario, String loginUsuario, String senhaUsuario, Boolean statusUsuario) {
    this.idUsuario = idUsuario;
    this.tipoUsuario = tipoUsuario;
    this.nomeUsuario = nomeUsuario;
    this.nascimentoUsuario = nascimentoUsuario;
    this.cpfUsuario = cpfUsuario;
    this.rgUsuario = rgUsuario;
    this.rmUsuario = rmUsuario;
    this.loginUsuario = loginUsuario;
    this.senhaUsuario = senhaUsuario;
    this.statusUsuario = statusUsuario;
}

public Integer getIdUsuario() {
    return idUsuario;
}

public void setIdUsuario(Integer idUsuario) {
    this.idUsuario = idUsuario;
}

public String getTipoUsuario() {
    return tipoUsuario;
}

public void setTipoUsuario(String tipoUsuario) {
    this.tipoUsuario = tipoUsuario;
}

public String getNomeUsuario() {
    return nomeUsuario;
}

public void setNomeUsuario(String nomeUsuario) {
    this.nomeUsuario = nomeUsuario;
}

public Date getNascimentoUsuario() {
    return nascimentoUsuario;
}

public void setNascimentoUsuario(Date nascimentoUsuario) {
    this.nascimentoUsuario = nascimentoUsuario;
}

public String getCpfUsuario() {
    return cpfUsuario;
}

public void setCpfUsuario(String cpfUsuario) {
    this.cpfUsuario = cpfUsuario;
}

public String getRgUsuario() {
    return rgUsuario;
}

public void setRgUsuario(String rgUsuario) {
    this.rgUsuario = rgUsuario;
}

public String getRmUsuario() {
    return rmUsuario;
}

public void setRmUsuario(String rmUsuario) {
    this.rmUsuario = rmUsuario;
}

public String getLoginUsuario() {
    return loginUsuario;
}

public void setLoginUsuario(String loginUsuario) {
    this.loginUsuario = loginUsuario;
}

public String getSenhaUsuario() {
    return senhaUsuario;
}

public void setSenhaUsuario(String senhaUsuario) {
    this.senhaUsuario = senhaUsuario;
}

public Boolean getStatusUsuario() {
    return statusUsuario;
}

public void setStatusUsuario(Boolean statusUsuario) {
    this.statusUsuario = statusUsuario;
}

}

Beleza, funciona assim dentro da sua classe Usuário você vai criar esse método:

public int converterNascimentoParaIdade(){
   	 int anos = this.nascimentoUsuario.getYear();//Nesta linha você ta pegando o ano de nascimento do Usuário
   	 return LocalDate.now().getYear()-anos;// Aqui você calcula quantos anos ele tem
} 

E no JSP você chama esse método. xD

Agradeço mais uma vez sua ajuda Victtor, entendi como funciona mas infelizmente a idade está vindo incorreta, o método que você me passou pega apenas o ano do nascimento e o ano atual, de alguma maneira se eu coloco que nasci no ano 2000 me retorna uma idade de 100 anos, se informo 1998 me retorna 98 rs… Vou continuar tentando, se conseguir informo o resultado! Obrigado xD

Como você ta inserindo esses dados? Tem como colocar o código como recebe.
O seu atributo nascimentoUsuario é do tipo java.util.Date correto?

Exatamente, ele é do tipo Date… Bom, criei este mesmo método na classe:

public int calcularIdade() {
int anos = this.nascimentoUsuario.getYear();
return LocalDate.now().getYear() - anos;
}

Em seguida chamei ele no meu listar-usuario.jsp:

                        <thead>
                        <th>Idade</th>
                        </thead>

                        <tbody>
                            <c:forEach items="${listarUsuario}" var="usuario">

                                <tr>
                                    <td> ${usuario.nascimentoUsuario.getYear()} </td>
                                </tr>

                            </c:forEach>
                        </tbody>

Mas por exemplo, se eu cadastro a data 02/08/2000, ele me retorna 100 anos. Estou tentando utilizar outros métodos, mas por enquanto sem sucesso.

Não, pera

Aqui você deveria acessar o método que converte e não tentar trazer o ano, tipo assim:

<td> ${usuario.calcularIdade()} </td>

Obrigado, estava tentando do jeito errado mesmo rs… O resultado que aparece agora é 1918 quando utilizo dessa maneira, mas já que entendi mais ou menos como funciona fica mais fácil, vou tentando utilizar métodos diferentes. Estou focando em outras partes do sistema também, mas quando eu conseguir aviso, agradeço mesmo pela ajuda! xD

Já imaginei qual seria o problema, quando fui testar vi que realmente era: A data está utilizando a variável Date, como o cálculo está sendo feito colocando-a como int, se eu vou utilizar o .getYear() ele me retorna o valor errado, neste caso 100. A conta teria que ser feita com datas, ou eu teria que criar um novo atributo do tipo inteiro, mas neste caso não daria pra utilizar o mesmo como data em outro momento… Tentei realizar a conversão com o seguinte método:

public int calcularIdade() {
    Date dataNascimento = this.nascimentoUsuario;
    final LocalDate dataAtual = LocalDate.now();
    Period periodo = Period.between(dataNascimento, dataAtual);
    return periodo.getYears();
}

O Period.between pega a data de nascimento e a data atual para calcular o período entre as duas, acontece que dá erro quando coloco dentro dele o dataNascimento, exatamente pelo fato de ser uma data e o método ser do tipo int.

Enfim, agora que entendi o problema não sei mesmo como resolver, mais tarde dou uma estudada e continuo tentando, se não der certo eu abandono essa questão de apresentar a idade calculando a data rs…

Consegui de uma maneira não muito correta, utilizei o mesmo método que você me passou, mas na hora de informar na jsp, fiz o seguinte:

                        <thead>
                        <th>Idade</th>
                        </thead>

                        <tbody>
                            <c:forEach items="${listarUsuario}" var="usuario">
                                <tr>
                                    <td> ${usuario.idadeUsuario()-1900} anos </td>
                                </tr>
                            </c:forEach>

                        </tbody>

Agora ele me retorna o valor praticamente correto, a única coisa que muda é que calcula por ano, então pode dar uma diferença dependendo do mês em que estiver… Mas por enquanto fica essa a solução. Obrigado pela paciência! :grinning:

Olá, tudo bem?
Essa forma que você fez não é muito aconselhada, olha eu refiz o método aqui e dessa maneira obtive o resultado esperado.

public int calcularIdade() {
	    LocalDate nascimento = LocalDate.of(this.nascimentoUsuario.getYear(), this.nascimentoUsuario.getMonth(), this.nascimentoUsuario.getDay());
	    final LocalDate dataAtual = LocalDate.now();
	    Period periodo = Period.between(nascimento, dataAtual);
	    return periodo.getYears();
	}

Dessa maneira ele funcionará no seu código como esperado.

Em nível de Design Pattern, não aconselho você utilizar assim. Seria melhor você alterar o tipo de seu atributo nascimentoUsuario, pois o tipo Date já está em desuso. Temos outros tipos como por exemplo o LocalDate ou até melhor o LocalDataTime que é pra mim a melhor opção. Enfim é só um conselho, espero que tenha resolvido seu problema com o código acima. Caso sim marca como resolvido. xD Abraço!