Como Caucular Idade?

33 respostas
leandro-maanaim

Pessoal minha duvida é simples pra muito… minha data de nascimento é 14/10/1982

como faço para caucular minha idade encima dessa data?

33 Respostas

Bird89du

Oi Leandro, se você quiser saber a lógica é essa:

Idade = dataAtual - dataNascimento;

vlw

leandro-maanaim

Meu probleminha nao está na logica é o seguinte quero saber tb se a pessoa ja fez aniversario esse ano se nao fez quando vai fazer, qts dias falta qts meses etc…

pvrsouza

Veja aqui e aqui

Bird89du

http://www.guj.com.br/posts/list/21062.java

aqui também

leandro-maanaim

NAO resolveu pq oque eu quero é o seguinte nasci em 05/03/2000 e minha data atual é 06/04/2010
ou seja eu quero o resultado 10 anos e 1 mese 1 dia :slight_smile:

humberto.lima

coloca a data invertida 20100406 e subtrai a outra 20100406 - 20000305 = 100101.

Poneis123

Caraca, nunca tinha visto… curti.

higornucci

curti [2]

guisantogui

ta ai naum conhecia, mta boa!

pvrsouza

E quando acontece isso:

Data atual: 06/04/2010
NAscimento: 20/06/1980

20100406 - 19800620 = 299786

Então:

  1. 86 dias = 2 meses e 26 dias.
  2. 97 + 2 mes = 99 meses
  3. 99 / 12 = 8,25 anos (nem me dei a trabalho de calcular o ,25 em meses)
  4. 29 + 8,25 = 37,5 anos

Seguindo esta lógica, eu teria hoje mais de 37 anos. E não tenho( ainda! ). Só tenho 29.

higornucci

leandro-maanaim:
NAO resolveu pq oque eu quero é o seguinte nasci em 05/03/2000 e minha data atual é 06/04/2010
ou seja eu quero o resultado 10 anos e 1 mese 1 dia :)

Você só tem 10 anos oO?

leandro-maanaim

Rlx foi só um exemplo rsrs

leandro-maanaim

Pessoal ola só vou colar o codigo aki e vcs dao uma olhada.

package DATA;

public class DATA2{

    public DATA2(){
        try{
            java.text.SimpleDateFormat df = new java.text.SimpleDateFormat ("dd/MM/yyyy hh:mm:ss");
            java.util.Date d1 = df.parse("14/10/1982 23:00:00");//data de Nascimento
            java.util.Date d2 = df.parse("15/10/2010 23:00:00");//Exemplo da minha Data Atual.
            System.out.println("DATA 1: "+d1.toLocaleString());
            System.out.println("DATA 2: "+d2.toLocaleString());

            System.out.println("DIFERENCA DE ANOS: "+ getDifAno(d1,d2));
            System.out.println("DIFERENCA DE MESES: "+ getDifMes(d1,d2));
            System.out.println("DIFERENCA DE DIAS: "+ getDifDia(d1,d2));
            System.out.println("DIFERENCA DE HORAS: "+ getDifHora(d1,d2));
            System.out.println("DIFERENCA DE MINUTOS: "+ getDifMinuto(d1,d2));
            System.out.println("DIFERENCA DE SEGUNDOS: "+ getDifSegundo(d1,d2));
            System.out.println("DIFERENCA DE MILISEGUNDOS: "+ getDifMilisegundo(d1,d2));
        }catch(java.text.ParseException p){
            p.printStackTrace();
        }
    }

    public static void main(String[] args) {
        DATA2 difDatas = new DATA2();
    }

    private long getDifAno(java.util.Date dtMenor, java.util.Date dtMaior){
        return dtMaior.getYear() - dtMenor.getYear();
    }

    private long getDifMes(java.util.Date dtMenor, java.util.Date dtMaior){
        return dtMaior.getMonth() - dtMenor.getMonth() + (getDifAno(dtMenor,dtMaior) * 12);
    }

    private long getDifDia(java.util.Date dtMenor, java.util.Date dtMaior){
        return (dtMaior.getTime() - dtMenor.getTime()) / (1000*60*60*24);
    }

    private long getDifHora(java.util.Date dtMenor, java.util.Date dtMaior){
        return (dtMaior.getTime() - dtMenor.getTime()) / (1000*60*60);
    }

    private long getDifMinuto(java.util.Date dtMenor, java.util.Date dtMaior){
        return (dtMaior.getTime() - dtMenor.getTime()) / (1000*60);
    }

    private long getDifSegundo(java.util.Date dtMenor, java.util.Date dtMaior){
        return (dtMaior.getTime() - dtMenor.getTime()) / (1000);
    }

    private long getDifMilisegundo(java.util.Date dtMenor, java.util.Date dtMaior){
        return dtMaior.getTime() - dtMenor.getTime();
    }

}

Olha oque ele me retorna.
DATA 1: 14/10/1982 23:00:00
DATA 2: 15/10/2010 23:00:00
DIFERENCA DE ANOS: 28
DIFERENCA DE MESES: 336
DIFERENCA DE DIAS: 10228
DIFERENCA DE HORAS: 245472
DIFERENCA DE MINUTOS: 14728320
DIFERENCA DE SEGUNDOS: 883699200
DIFERENCA DE MILISEGUNDOS: 883699200000

Nao deveria de me retornar 29 anos e 0 meses e 1 dia?
como faço pra ele me retornar 29 anos e 0 mes e 1 dia etc…?

Poneis123

pvrsouza:
E quando acontece isso:

Data atual: 06/04/2010
NAscimento: 20/06/1980

20100406 - 19800620 = 299786

Então:

  1. 86 dias = 2 meses e 26 dias.
  2. 97 + 2 mes = 99 meses
  3. 99 / 12 = 8,25 anos (nem me dei a trabalho de calcular o ,25 em meses)
  4. 29 + 8,25 = 37,5 anos

Seguindo esta lógica, eu teria hoje mais de 37 anos. E não tenho( ainda! ). Só tenho 29.

É retira o que disse, num curti não… kkkkkkkkk

Poneis123

leandro-maanaim:
Pessoal ola só vou colar o codigo aki e vcs dao uma olhada.

Olha oque ele me retorna.
DATA 1: 14/10/1982 23:00:00
DATA 2: 15/10/2010 23:00:00
DIFERENCA DE ANOS: 28
DIFERENCA DE MESES: 336
DIFERENCA DE DIAS: 10228
DIFERENCA DE HORAS: 245472
DIFERENCA DE MINUTOS: 14728320
DIFERENCA DE SEGUNDOS: 883699200
DIFERENCA DE MILISEGUNDOS: 883699200000

Nao deveria de me retornar 29 anos e 0 meses e 1 dia?
como faço pra ele me retornar 29 anos e 0 mes e 1 dia etc…?

Deveria retornar 28 Anos 0meses e 1dia… para retornar isso vc ta usando as datas do calendario onde fev vai até 28/29 dias e etc… pra ter esse resultado vc precisa usar Calendar ou o GregorianCalendar

Poneis123

Acho q da pra fazer assim tb… só que vc vai ter problema qdo o mes ou dia atual for menor que o do nascimento…

Duvida: Ali no seu

private long getDifMes(java.util.Date dtMenor, java.util.Date dtMaior){ return dtMaior.getMonth() - dtMenor.getMonth() + (getDifAno(dtMenor,dtMaior) * 12); }
pq vc colocou getDifAno(dtMenor,dtMaior) * 12 ?? isso resulta em 28 * 12 = 336 (o resultado q saiu para os meses)

humberto.lima

iiiiiiiiiiiiiiiii, falhou…
20100406 - 19800620 = 299786

é o seguinte… tentando convencer o chefe…

o 97 me diz que falta 3 unidades para completar a proxima unidade (unidade de ano)… ou seja, faltam 3 meses pra completar um ano… estou com 9 meses
e o 86 a mesma coisa… faltaram 14 dias pra completar uma unidade de mes ou seja 30 - 14 = estou com 16 dias

no final… 29 anos 9 meses e 16 dias… ta certo?

:wink:

Poneis123

humberto.lima:
iiiiiiiiiiiiiiiii, falhou…
20100406 - 19800620 = 299786

é o seguinte… tentando convencer o chefe…

o 97 me diz que falta 3 unidades para completar a proxima unidade (unidade de ano)… ou seja, faltam 3 meses pra completar um ano… estou com 9 meses
e o 86 a mesma coisa… faltaram 14 dias pra completar uma unidade de mes ou seja 30 - 14 = estou com 16 dias

no final… 29 anos 9 meses e 16 dias… ta certo?

:wink:

Caracaaaa curti msm kkkkkkkkkk eu tentei fazer isso mas num consegui pensar dessa forma… agora assim… vc usou 30 - 14… ta errado… os meses não são todos de 30 dias. em 20/03/2010 ele tinha 29 anos e 9 meses, certo? passado 11 dias ele entrou em abril(pois março vai até 31) e + 6 dias de abril, ele tem 17 dias.

leandro-maanaim

“Num entindi oque vcs falô” :S

Poneis123

Cara esse negocio de data invertida : 20100406 - 19800620 = 299786 foi a ideia do humberto.lima q acabou gerando esse assunto q ta rolando… responde as perguntas q eu fiz pra vc ae:

e outra coisa, nessas datas q vc colocou a pessoa tem 28anos 0mes e 1dia.

Duvida: Ali no seu

private long getDifMes(java.util.Date dtMenor, java.util.Date dtMaior){ return dtMaior.getMonth() - dtMenor.getMonth() + (getDifAno(dtMenor,dtMaior) * 12); }
pq vc colocou getDifAno(dtMenor,dtMaior) * 12 ?? isso resulta em 28 * 12 = 336 (o resultado q saiu para os meses)

ViniGodoy

Use o Joda-Time. A classe Period faz esse cálculo para você:
http://joda-time.sourceforge.net/

Se você trabalha com datas, esqueça a API de datas do Java. Ela é péssima.

O link acima será a solução de todos os seus problemas.

leandro-maanaim

Ta beleza eu corrigir meu Mês agora meu dia que ta dando problema.

Poneis123

Mesmo corrigindo esses erros, vc vai ter problema qdo o mes e/ou dia de nascimento for maior que mes/dia atual…

ex: nascimento: 07/04/1980
Hoje: 06/04/2010

Amanha fará 30 anos… porém no seu código, 2010 - 1980 = 30 já dará 30 anos, mas ele ainda tem 29 anos…

Bom as dicas do Vini num falham… ve ai o post dele.

abrs.

leandro-maanaim

Nossa agora que complicou mais ainda…pq olha só…quando eu coloco minha data de nascimento como 14/10/1982 e sendo que eu só faço aniversario em 14/10/2010 certo? dai o ano me retorna 28 anos, só que se eu mudar minha data para 13/10/2010 ele deveria me retorna 27 nao? pq ele continua me retornando 28?

Poneis123

é exatamente o exemplo que eu coloquei acima…

humberto.lima
package teste;

public class TestContaIdade {

	public static void main(String[] args) {
		long dataNascimento = 19821020L;

		long dataHoje = 20101019L;

		calculaIdade(dataNascimento, dataHoje);
		
		dataNascimento = 19821020L;
		dataHoje = 20101021L;
		
		calculaIdade(dataNascimento, dataHoje);
		
		dataNascimento = 19821020L;
		dataHoje = 20101020L;
		
		calculaIdade(dataNascimento, dataHoje);
	}

	private static void calculaIdade(long dataNascimento, long dataHoje) {
		long intervalo = dataHoje - dataNascimento;

		int ano = (int) (intervalo / 10000);

		int mes = (int) (intervalo / 100) - 100 * ano;

		int dia = (int) intervalo - (10000 * ano) - (100 * mes);

		System.out.println("Ano:" + ano);

		System.out.println("Mes:" + mes);

		System.out.println("Dia:" + dia);

		// o mes so pode variar entre [1 e 12] e [88 e 99], se for maior q 12
		// quer dizer q precisou "pedir emprestado" a unidade superior.
		if (mes > 12) {
			mes = 12 - (100 - mes);
		}

		// melhorar, procurar qntos dias tem o mes, pode ser com um map ou um array.
		if (dia > 31) {
			dia = 31 - (100 - dia);
		}

		System.out.println("Ano corrigido:" + ano);

		System.out.println("Mes corrigido:" + mes);

		System.out.println("Dia corrigido:" + dia);
	}
}
pedroroxd

Isso não existe não fião!
kkkkkkkkkk
foi 1 mera coincidencia!

leandro-maanaim

Quaze lá entao, blz vamos lá…na hora de eu inserir a data de nascimento no TextField ei vou inserir deça maneira né…14/10/1982 , mais i na hora de caucular a data ja que ele faz de traz para frente como faço pra formatar? que ficaria no caso 1982/10/14…

walacy

http://joda-time.sourceforge.net/

Acredito que essa API resolve todos os seus problemas… :wink:

leandro-maanaim

Não resolve…pq é o seguinte. ta muito complexa para um iniciante em java que é o meu caso. Mesmo assim Vlw. Alguem pode me ajudar?

humberto.lima

Isso não existe não fião!
kkkkkkkkkk
foi 1 mera coincidencia!

Entre: 23/11/1926 e 16/07/1933
Minha função: 6 anos, 7 meses, 24 dias 
JODA        : 6 anos, 7 meses, 23 dias 
Entre: 13/05/1992 e 26/02/2010
Minha função: 17 anos, 9 meses, 13 dias 
JODA        : 17 anos, 9 meses, 13 dias 
Entre: 20/02/1943 e 25/11/1984
Minha função: 41 anos, 9 meses, 5 dias 
JODA        : 41 anos, 9 meses, 5 dias 
Entre: 06/10/1969 e 10/07/1986
Minha função: 16 anos, 9 meses, 4 dias 
JODA        : 16 anos, 9 meses, 4 dias 
Entre: 14/03/1908 e 21/07/1990
Minha função: 82 anos, 4 meses, 7 dias 
JODA        : 82 anos, 4 meses, 7 dias 
Entre: 02/07/1986 e 16/07/1990
Minha função: 4 anos, 0 meses, 14 dias 
JODA        : 4 anos, 0 meses, 14 dias 
Entre: 20/10/1965 e 12/12/1984
Minha função: 19 anos, 1 meses, 23 dias 
JODA        : 19 anos, 1 meses, 22 dias 
Entre: 06/02/1933 e 06/07/1964
Minha função: 31 anos, 5 meses, 0 dias 
JODA        : 31 anos, 5 meses, 0 dias 
Entre: 22/10/1962 e 28/11/1962
Minha função: 0 anos, 1 meses, 6 dias 
JODA        : 0 anos, 1 meses, 6 dias 
Entre: 26/10/1968 e 17/01/1979
Minha função: 10 anos, 2 meses, 22 dias 
JODA        : 10 anos, 2 meses, 22 dias 
Entre: 17/01/1953 e 04/01/1993
Minha função: 39 anos, 11 meses, 18 dias 
JODA        : 39 anos, 11 meses, 18 dias 
Entre: 08/02/2001 e 14/11/2003
Minha função: 2 anos, 9 meses, 6 dias 
JODA        : 2 anos, 9 meses, 6 dias 
Entre: 17/07/1992 e 28/08/2007
Minha função: 15 anos, 1 meses, 11 dias 
JODA        : 15 anos, 1 meses, 11 dias 
Entre: 27/12/1979 e 19/02/2007
Minha função: 27 anos, 1 meses, 23 dias 
JODA        : 27 anos, 1 meses, 23 dias 
Entre: 05/05/1988 e 07/10/2010
Minha função: 22 anos, 5 meses, 2 dias 
JODA        : 22 anos, 5 meses, 2 dias 
Entre: 21/08/1939 e 12/12/1949
Minha função: 10 anos, 3 meses, 22 dias 
JODA        : 10 anos, 3 meses, 21 dias 
Entre: 09/04/1999 e 23/08/2004
Minha função: 5 anos, 4 meses, 14 dias 
JODA        : 5 anos, 4 meses, 14 dias 
Entre: 06/08/1980 e 10/03/2007
Minha função: 26 anos, 7 meses, 4 dias 
JODA        : 26 anos, 7 meses, 4 dias 
Entre: 11/04/2008 e 12/12/2008
Minha função: 0 anos, 8 meses, 1 dias 
JODA        : 0 anos, 8 meses, 1 dias 
Entre: 08/03/1944 e 18/02/1960
Minha função: 15 anos, 11 meses, 10 dias 
JODA        : 15 anos, 11 meses, 10 dias

c acha?

leandro-maanaim

Caraka pra vcs podem estar parecendo muito facil mais pra min ta tenso… ele está me retornando um valor correto como eu quero, mais só se a data estiver 19821014 mais na hora que eu vou inserir no tesxtfield eu vou inserir 14/10/1982 :frowning:

leandro-maanaim

Alguem pode me da uma força?

Criado 6 de abril de 2010
Ultima resposta 8 de abr. de 2010
Respostas 33
Participantes 10