Dicas para criar um metodo de calcular idade no Java baseado em data de nascimento em uma classe (Netbeans)

Estou tentando concluir a questão desse exercício

1- Crie uma classe para representar uma Pessoa com os atributos privados de nome, data de nascimento e
altura. Crie os métodos públicos necessários para getters e setters e também um método para imprimir
todos dados de uma pessoa. Crie um método para calcular a idade da pessoa.

Fiz tudo certo, só não sei o que fazer para poder calcular a idade baseado na data de nascimento, tentei inumeras tentativas só que não da certo (só n mando as tentativas pra não alongar e apaguei elas só no odio) haha

import java.time.Year;
import java.util.Date;

/**
 *
 * @author kauan
 */
public class Principal {
   String nome;
   Date dataNascimento;
   float altura;
   
 
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Date getDataNascimento() {
        return dataNascimento;
    }

    public void setDataNascimento(Date dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    public float getAltura() {
        return altura;
    }

    public void setAltura(float altura) {
        this.altura = altura;
    }
   
    public void ImprimirDados(){
        System.out.println("Nome: " + nome);
        System.out.println("Data de nascimento: " + dataNascimento);
        System.out.println("Altura: " + altura);
        
    }

Se alguém perguntar sua idade, o que você vai responder?
Como você faz para saber sua idade?

Colega eu to tentando calcular a data de nascimento pela data atual do dia de hoje mas não tem como fazer um Data.today - data.nascimento como no Pyhton :roll_eyes:, se desse, faria meu metodo sem precisar pedir auxilio no forum

final LocalDate nascimento = LocalDate.of(1990, 10, 20);
final LocalDate hoje = LocalDate.now();
final Period idade = Period.between(nascimento, hoje);

idade.getYears(); // anos
idade.getMonths(); // meses
idade.getDays(); // dias
2 curtidas

Mano, como assim? O que o colega @staroski fez foi tentar um estímulo para vc pensar na solução. E o que ele propôs foi exatamente a forma de pensar necessária para chegar na solução de qualquer problema.

2 curtidas

Usando Date, é complicado mesmo, porque a API antiga não fornece mecanismos adequados para cálculos com datas.

O ideal hoje em dia é usar a nova API java.time, como já indicado acima. Esta API está disponível desde o Java 8 (março de 2014), então a menos que vc esteja mexendo em código legado que ainda depende de java.util.Date, não há motivo para continuar sofrendo :slight_smile:

Enfim, se quer mesmo continuar usando Date, tem que fazer tudo na mão. E como vc faz o cálculo manualmente? Basicamente:

  • subtrai o ano atual do ano de nascimento
  • se ainda não chegou o aniversário, subtrai 1

Algo assim:

Date dataNascimento = // alguma data de nascimento qualquer
Calendar nasc = Calendar.getInstance();
nasc.setTime(dataNascimento);
// data atual
Calendar hoje = Calendar.getInstance();

int idade = hoje.get(Calendar.YEAR) - nasc.get(Calendar.YEAR);;
int mesAtual = hoje.get(Calendar.MONTH);
int mesNasc = nasc.get(Calendar.MONTH);
if (mesNasc > mesAtual) { // se o mês do aniversário ainda não chegou
    idade--;
} else if (mesAtual == mesNasc) {
    // é o mês do aniversário, mas o dia ainda não chegou
    if (nasc.get(Calendar.DAY_OF_MONTH) > hoje.get(Calendar.DAY_OF_MONTH)) {
        idade--;
    }
}
System.out.printf("Idade=%d anos\n", idade);

Ou ainda, colocando todas as condições em um único if:

int idade = hoje.get(Calendar.YEAR) - nasc.get(Calendar.YEAR);
int mesAtual = hoje.get(Calendar.MONTH);
int mesNasc = nasc.get(Calendar.MONTH);
if ((mesNasc > mesAtual) || (mesAtual == mesNasc && nasc.get(Calendar.DAY_OF_MONTH) > hoje.get(Calendar.DAY_OF_MONTH))) {
    idade--;
}

Usando java.time

Com java.time, é muito mais simples. Mas em vez de Date, vc vai ter que usar as novas classes. No caso de data de nascimento, geralmente usa-se somente o dia, mês e ano, então a classe mais adequada é java.time.LocalDate.

Se vc só quer o valor numérico da idade em anos, basta usar um java.time.temporal.ChronoUnit:

LocalDate nascimento = LocalDate.of(2000, 2, 21);
LocalDate hoje = LocalDate.now();
long idade = ChronoUnit.YEARS.between(nascimento, hoje);
System.out.printf("Idade=%d anos\n", idade);

Se quer a idade quebrada em campos (anos, meses e dias), pode usar Period como já indicado:

LocalDate nascimento = LocalDate.of(2000, 2, 21);
LocalDate hoje = LocalDate.now();
Period idade = Period.between(nascimento, hoje);
System.out.printf("idade=%d anos, %d meses, %d dias\n", idade.getYears(), idade.getMonths(), idade.getDays());

Só um detalhe, e se alguém nasceu em 29 de fevereiro?

// nasceu em 29 de fevereiro de 2000
LocalDate nascimento = LocalDate.of(2000, 2, 29);
// em 28 de fevereiro de 2001, qual será a idade?
LocalDate hoje = LocalDate.of(2001, 2, 28);
Period idade = Period.between(nascimento, hoje);
System.out.printf("idade=%d anos, %d meses, %d dias\n", idade.getYears(), idade.getMonths(), idade.getDays());

No exemplo acima, a data de nascimento é 29 de fevereiro de 2000. Nesse caso, em 28 de fevereiro de 2001, qual será a idade?

O resultado do código acima é idade=0 anos, 11 meses, 30 dias. Isso porque a API entende que só completa-se 1 ano a partir do dia 29 de fevereiro. Mas como 2001 não é bissexto, então somente a partir de 1 de março de 2001 é que se completaria 1 ano.

Este é um corner case que precisa ser pensado caso a caso. Conheço pessoas que nasceram em 29 de fevereiro, e em anos não bissextos comemoram em 1 de março. Mas isso não quer dizer que seja uma regra universal. Aliás, nem sequer existe: aritmética de datas não tem definições precisas e oficiais como é na matemática, então cabe a vc decidir o que fazer nestes casos.

3 curtidas

Eu entendi o ponto dele mas como também entendo o seu, mas se eu ficar pensando como fiquei pensando insistivamente e fazendo varias tentativas nunca ia chegar na conclusão que o @hugokotsubo me deu, porque ele me deu explicação didatica sobre o que eu deveria entender do conteúdo, estou no forum para isso, para aprender e buscar respostas como ele me auxiliou. Espero que não me entenda mal :sweat_smile:. Até porque as vezes precisamos de uma orientação e não um simples “se vire”

MUITOOOO OBRIGADO, MESMO DE VERDADE, VOCÊ É MUITO DEMAIS!

System.out.println("Você é 10")

Brigadoooo

Hey, to tentando fazer mas ta gerando erro de compilação, por que sera? O netbeans sempre avisa quando tem algo errado, nem deu lampada vermelha
Erro
(Ignore a má identação pfvr)

`package pessoa;

import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.ChronoUnit;
import java.util.Date;
/**
*

  • @author kauan
    */
    public class Principal {
    String nome;
    Date dataNascimento;
    float altura;

    public String getNome() {
    return nome;
    }

    public void setNome(String nome) {
    this.nome = nome;
    }

    public Date getDataNascimento() {
    return dataNascimento;
    }

    public void setDataNascimento(Date dataNascimento) {
    this.dataNascimento = dataNascimento;
    }

    public float getAltura() {
    return altura;
    }

    public void setAltura(float altura) {
    this.altura = altura;
    }

    public void CalcularIdade(){

    /* LocalDate nascimento = LocalDate.of(2003, 8, 10);
    LocalDate hoje = LocalDate.now();
    long idade = ChronoUnit.YEARS.between(nascimento, hoje);
    System.out.println("Idade: " + idade); */

     final LocalDate nascimento = LocalDate.of(2003, 8, 10);
     final LocalDate hoje = LocalDate.now();
     final Period idade = Period.between(nascimento, hoje);
    
     idade.getYears();
     idade.getMonths();
     idade.getDays();
     System.out.println(idade);
    

    }

    public void ImprimirDados(){
    System.out.println("Nome: " + nome);
    System.out.println("Data de nascimento: " + dataNascimento);
    System.out.println("Altura: " + altura);

    }

}

Somente com esse código, compilou sem problemas. O problema deve estar em outra classe.

Procure no console a mensagem, geralmente ela indica a classe e a linha onde ocorreu o erro.

Descobri, nas classes java.time.temporal, java.time e ChronoUtil da esse erro

package exists in another module: java.base

O que fazer?

Deve ser alguma configuração do projeto no Netbeans. Sugiro dar uma olhada nesses links

Obrigado