Descobrir idade

4 respostas
R

Fala pessoal…

to fazendo um calculo de idade aki, mas tah estranho…

to fazendo assim:

( hoje.getTime() - nascimento.getTime() ) / (365*24*60*60*1000)

tah certo esse calculo?? eh q a subtracao me retorna o valor em mili-segundos…preciso voltar isso p/ anos…

valew

4 Respostas

wbsouza

O erro está tentar calcular multiplicando tudo o que irá dividir, e a cada passagem de uma unidade para outra necessariamente há "perda" de valores pois a conta não é exata. Da maneira que vc fez daria certo se a divisão fosse exata sempre, o que quase nunca acontece :wink:

Veja uma classe que fiz para mostrar isto, e olhe "a surpresa" do resultado da execução:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class CalculaAnos {
    
    public static void main(String[] args) {
        
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        try {
            
            Date dateOne = sdf.parse("01/01/1972 10:00:00");
            Date dateTwo = sdf.parse("01/01/2004 11:00:00");
            
            long longOne = dateOne.getTime();
            long longTwo = dateTwo.getTime();
            long diff = longTwo - longOne;
            
            diff /= 1000; // diferenca em segundos
            diff /= 60;   // diferenca em minutos
            diff /= 60;   // diferenca em horas
            diff /= 24;   // diferenca em dias
            diff /= 365;  // diferenca em anos
            
            System.out.println("A diferenca metodo de divisoes sucessivas é de :" + diff);
            
            diff = longTwo - longOne;
            diff /= 1000 * 60 * 60 * 24 * 365; // tenta calcular a diferença desta forma 
            System.out.println("A diferenca metodo de multiplicação é de :" + diff);
            
        }
        catch (ParseException e) {
            System.err.println(e);
        }
    }
}

[]s, Welington B. Souza

R

putz…

valew mesmo pela dica wbsouza…agora deve funcionar meu calculo…

falow

D

“rbarioni”:

( hoje.getTime() - nascimento.getTime() ) / (365*24*60*60*1000)


Sabe, 3652460601000 = 31.536.000.000, mas o java está tratando essas operações como multiplicação de inteiros, e como Integer.MAX_VALUE = 2.147.483.647, ocorre overflow na multiplicação.

Dessa forma, basta indicar que a multiplicação é com números do tipo long.

( hoje.getTime() - nascimento.getTime() ) / (365L * 24L * 60L * 60L * 1000L)
wbsouza

OK, não tinha pensado nisso. A explicação que encontrei foi de que ao dividir estava deveria perder alguma coisa. Na verdade vc matou o problema :lol:

[]s, Welington B. Souza

Criado 14 de julho de 2004
Ultima resposta 20 de jul. de 2004
Respostas 4
Participantes 3