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." ) ;
}
}