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:
// 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:
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:
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
}
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
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…
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!
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!