Problemas de iniciante com java

Estou começando a aprender java agora e em uma das minhas primeira tarefas já estou sem saber oque fazer, estou a horas procurando como subtrair a partir do código de “Date” mas não encontro nada, de qual forma posso conseguir pegar a data atual e subtrair por uma questionada pelo programa? estou usando uma classe abstrata pois é obrigatória para a questão (Código básico a baixo)

image

Veja:

// guarda o ano de nascimento
int anoNascimento = 1987;

// recupera a data atual
LocalDate agora = LocalDate.now();

// subtrai o ano de nascimento da data atual
// e obtém a diferença entre o ano atual e o ano de nascimento
LocalDate dataNascimento = agora.minus(anoNascimento, ChronoUnit.YEARS);

// imprime o resultado
System.out.println("Você tem " + dataNascimento.getYear() + " anos.");
1 curtida

Lucas, o problema desta solução é que ela não leva em conta o dia e o mês do nascimento. Uma pessoa que nasceu em 01/10/1987 apareceria como se já tivesse 34 anos quando na verdade tem 33 ainda.

Usando LocalDate o mais correto seria assim:

LocalDate dataDeNascimento = LocalDate.of(1987, 10, 1);
long idade = ChronoUnit.YEARS.between(dataDeNascimento, LocalDate.now());
System.out.println(idade);

Mas como ele precisa trabalhar com Date, daria pra fazer assim com a ajuda de Calendar, assim:

try {
  SimpleDateFormat format = new SimpleDateFormat("dd/M/yyyy");

  Date dataDeNascimento = format.parse("08/09/1987");

  long diferenca = new Date().getTime() - dataDeNascimento.getTime();

  Calendar calendar = Calendar.getInstance();

  calendar.setTimeInMillis(diferenca);

  System.out.println(calendar.get(Calendar.YEAR) - 1970);
} catch (ParseException e) {
  e.printStackTrace();
}

Não é a solução perfeita, pois apesar de hoje ser dia 7, se a pessoa nasceu em 08/09/1987, vai dar que ela já tem 34 anos.

Se vc puder, dá pra respeitar a assinatura do método, recebendo um Date, mas trabalhar com LocalDate internamente, seria algo assim:

private int calcularIdade(Date dataDeNascimento) {
  LocalDate data = dataDeNascimento
      .toInstant()
      .atZone(ZoneId.systemDefault())
      .toLocalDate();

  return (int) ChronoUnit.YEARS.between(data, LocalDate.now());
}

Assim que puder, abandone Date, Calendar e companhia e use a API mais moderna do LocalDate e outros.

1 curtida

Vlw @wldomiciano. Acho que nunca precisei usar dessa forma. Bem prático! Vlw!

1 curtida