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)
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