Calculo de idade - Resolvido

Ola pessoal, toh montando uma rotina pra calculo exato de idade: anos, mes(es) e dia(s), me se enrolei todo com um codigo que tah dando um erro em mes(es) e/ou dias no caso da data de aniversario do sujeito ser maior corrente (hoje), tai meu codigo.

package wiske;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class calculaIdade { 
   public static void main ( String [] args ) throws IOException { 
    int day = 1 , month = 0 , year = 1 , ageYears, ageMonths, ageDays; 
    BufferedReader in = new BufferedReader ( new InputStreamReader ( System.in )) ; 
    Calendar cd = Calendar.getInstance () ; 
    try { 
     System.out.print ( "Digite o ano da sua data de nascimento : " ) ; 
     year = Integer.parseInt ( in.readLine ()) ; 
     if ( year > cd.get ( Calendar.YEAR )){ 
        System.out.print ( "Ano de nascimento Invalida." ) ; 
        System.exit ( 0 ) ; 
       } 
       System.out.print ( "Digite o mês do nascimento : " ) ; 
       month = Integer.parseInt ( in.readLine ()) ; 
     if ( month < 1 || month > 12 ){ 
       System.out.print ( "Mes valido de 1 a 12." ) ; 
       System.exit ( 0 ) ; 
       } 
     else { 
     month--; 
     if ( year == cd.get ( Calendar.YEAR )){ 
       if ( month > cd.get ( Calendar.MONTH )){ 
         System.out.print ( "Mes inavlido!" ) ; 
         System.exit ( 0 ) ; 
         } 
       } 
      } 
      System.out.print ( "Entre com o dia do nascimento : " ) ; 
      day = Integer.parseInt ( in.readLine ()) ; 
      if ( month == 0 || month == 2 || month == 4 || month == 6 || month == 7 || 
        month == 9 || month == 11 ){ 
        if ( day > 31 || day < 1 ){ 
           System.out.print ( "Dia valido de entre 1 a 31." ) ; 
           System.exit ( 0 ) ; 
           } 
          } 
      else if ( month == 3 || month == 5 || month == 8 || month == 10 ){ 
        if ( day > 30 || day < 1 ){ 
         System.out.print ( "Dia valido entre  1 a 30." ) ; 
         System.exit ( 0 ) ; 
         } 
        } 
      else { 
        if ( new GregorianCalendar () .isLeapYear ( year )){ 
          if ( day < 1 || day > 29 ){ 
            System.out.print ( "Dias entre 1 a 29." ) ; 
            System.exit ( 0 ) ; 
          } 
        } 
        else if ( day < 1 || day > 28 ){ 
        System.out.print ( "Dias entre 1 a 28." ) ; 
        System.exit ( 0 ) ; 
      } 
     } 
     if ( year == cd.get ( Calendar.YEAR )){ 
      if ( month == cd.get ( Calendar.MONTH )){ 
        if ( day > cd.get ( Calendar.DAY_OF_MONTH )){ 
        System.out.print ( "Data invalida!" ) ; 
        System.exit ( 0 ) ; 
        } 
      } 
     } 
    } 
   catch ( NumberFormatException ne ){ 
     System.out.print ( ne.getMessage () + " entrada incorreta!" ) ; 
     System.out.print ( "numero invalido" ) ; 
     System.exit ( 0 ) ; 
    } 
    Calendar bd = new GregorianCalendar ( year, month, day ) ; 
    ageYears = cd.get ( Calendar.YEAR ) - bd.get ( Calendar.YEAR ) ; 
    if ( cd.before ( new GregorianCalendar ( cd.get ( Calendar.YEAR ) , month, day ))){ 
      ageYears--;      
      ageMonths = ( 12 - ( bd.get ( Calendar.MONTH ) + 1 )) + ( bd.get ( Calendar.MONTH )-1) ; 
      System.out.println(( 12 - ( bd.get ( Calendar.MONTH )+1 )) + ( bd.get ( Calendar.MONTH  )-2));       
      if ( day > cd.get ( Calendar.DAY_OF_MONTH )){ 
       ageDays = day - cd.get ( Calendar.DAY_OF_MONTH ) ; 
      // ageDays = cd.get ( Calendar.DAY_OF_MONTH )- day ;
       //System.out.println(day);
        System.out.println(cd.get ( Calendar.DAY_OF_MONTH ));      
       } 
      else if ( day < cd.get ( Calendar.DAY_OF_MONTH )){ 
       ageDays = cd.get ( Calendar.DAY_OF_MONTH ) - day;       
      }      
    else { 
     ageDays = 0 ;     
     } 
    } 
   else if ( cd.after ( new GregorianCalendar ( cd.get ( Calendar.YEAR ) , month, day ))){ 
     ageMonths = ( cd.get ( Calendar.MONTH ) - ( bd.get ( Calendar.MONTH ))) ; 
     System.out.println("estou aqui em baixo");
     if ( day > cd.get ( Calendar.DAY_OF_MONTH )) 
      ageDays = day - cd.get ( Calendar.DAY_OF_MONTH ) - day;     
    else if ( day < cd.get ( Calendar.DAY_OF_MONTH )){ 
      ageDays = cd.get ( Calendar.DAY_OF_MONTH ) - day;       
    } 
   else 
     ageDays = 0 ; 
     } 
     else { 
      ageYears = cd.get ( Calendar.YEAR ) - bd.get ( Calendar.YEAR ) ; 
      ageMonths = 0 ; 
      ageDays = 0 ; 
    } 
    System.out.print ( "Idade : " + ageYears + " anos, " + ageMonths +   
    " meses e " + ageDays + " dias." ) ; 
 }
}

que erro?

digao: um exemplo se tenho aniversario em 21/06/1988 minha idade eh Idade : 23 anos, 10 meses e 5 dias
agora se coloco a dada de aniversario em 27/06/1988 minha idade eh Idade : 23 anos, 10 meses e 1 dias

Cara na linha 28 tem um month – , para que server isso??
(faz assim compila de novo e coloque aqui a exception).

o problema ta aqui if ( day > cd.get ( Calendar.DAY_OF_MONTH )){ ageDays = day - cd.get ( Calendar.DAY_OF_MONTH ) ;

porque se o dia informado (27) for maior do que o dia atual (26), você precisa manipular os meses também, não só os dias.

Eu usaria Calendar.(qualquer coisa que tu precise), vou dar um exemplo do porque:

  • Se você tem que retornar o mês informado para criar um date, por exemplo, você não pode retornar 12…pq o date interpreta isso como janeiro de um ano APÓS o informado…se você retornar Calendar.DECEMBER ele retornará 11…o que é o correto para a criação de um date.

[quote=digaoneves]o problema ta aqui if ( day > cd.get ( Calendar.DAY_OF_MONTH )){ ageDays = day - cd.get ( Calendar.DAY_OF_MONTH ) ;

porque se o dia informado (27) for maior do que o dia atual (26), você precisa manipular os meses também, não só os dias.[/quote]

digao, pelo que entendi, terei que contar dias tambem, tipo se o mês for de 30 dias - os dias que faltam, tah osso.

Então… você tem que manipular os dias, mas os meses também… tem muitos cenários a serem testados hehehe…

Se você estiver fazendo isso pra estudo, muito bem, continue indo, mas se for pra trabalho ou coisas assim, sugiro que use a JodaTime, os métodos dela vão te facilitar muito a vida hehehehe

carcara, se for exercício de faculdade, tudo bem, tem que fazer mesmo.
Se for trampo e afins, te sugiro usar o joda-time que faz tudo isso aí que você quer e mais um pouco. E em poucas linhas também.

carcara, vou te passar o resultado de como fazemos esse calculo aqui, não tem erro basta voce colocar as datas em ano/mes/dia e diminuir a data maior pela data menor, com um montinho de “ifs” voce faz isso. veja os exemplo


                  calculo dias       calculo mes    calculo ano
2012  04  26 -->    2012 04 26       2011 16 26    2011  16  26
1988  06  21             06 28            06 21    1988  06  21
                    ----------      ------------  --------------
                         -   5            10  5      23  10   5
---------------------------------------------------------------- 
nascimento em 27/04/1988

2012  04  26 -->    2012 03 56       2011 15 56    2011  15  56
1988  04  27                27            04 27    1988  04  27 
                    ----------       ----------    ------------
                            29            11 29      23  11  29

vfoxpro - vcaldtncto.

brigado a todo mundo, funcionou legal