31/02/2003 é uma data válida?

Gente, estou com dificuldade em validar data… Já tentei vários métodos que encontrei aqui no Fórum e atualmente estou fazendo da seguinte maneira:

public boolean dataValida(int dia, int mes, int ano) {
try {
GregorianCalendar gc = new GregorianCalendar();
gc.setLenient(false);
gc.set(Calendar.YEAR, ano);
gc.set(Calendar.MONTH, mes);
gc.set(Calendar.DAY_OF_MONTH, dia);
System.out.println(gc.get(Calendar.DAY_OF_MONTH));
return true;
} catch (Exception pex) {
return false;
}

}

Até que estria perfeito… Se ele não aceitasse 31/02/2000… :slight_smile:
Alguém pode me ajudar?

http://www.guj.com.br/servlet/guj?PARSE=true&MAMUTE_ACTION=br.com.guj.action.ListTutorial&MAMUTE_TEMPLATE=ShowTutorial&LIST_TUTORIAL=single&TutorialId=8&PAGE=1

Tente com este tutorial…

Não ajudou muito… Lá fala sobre formatador, comparação, etc. Esse não é o problema, pelo menos não até onde eu vejo…

É engraçado, pq ele tenta fazer uma triagem, mas ao que parece é do estilo : Se dia for maior que 31 está errado, se for menor está certo… Ele não relaciona o dia com o mês, tipo, 31 de abril está errado pq abril só tem 30 dias…

Vê se isso pode te ajudar, são alguns exemplos do JavaAlmanac.
http://javaalmanac.com/cgi-bin/search/find.pl?l=split&words=Calendar

Cecília,vc pode fazer uns ifs comparando com getMaximum ou getActualMaximum(não sei se dah para fazer de forma mais direta)
Detalhes:
http://www.javaalmanac.com/egs/java.util/GetDaysInMonth.html?l=rel
Aí não dah para ter estouro…
ou usar java.text.SimpleDateFormat e fazer da forma q lhe for pertinente.
No link do Igor vc encontra isso! :wink:

Tente o seguinte:

SimpleDateFormat format = new SimpleDateFormat("DD/MM/yyyy");
format.setLenient(false);

Cecilia, tenho esse codigo aqui que funciona legal, mas é como fazer refazer a roda :smiley: … De qqer forma ta ai:

[code]
private boolean validaData(Object digitado) {
boolean bOk = true;
boolean bAnoBissexto = false;
int iRestoCalculoAnoBissexto = 0;
int[] iUltimoDiaMes = new int[13];
String sMensagemDataInvalida = “Data inválida !
Formato: DD/MM/YYYY”;

    //Carrega a array com o ultimo dia de cada mes.
    iUltimoDiaMes[1] = 31;
    iUltimoDiaMes[2] = 28; //Se o ano for bissexto sera atribuido o dia 29.
    iUltimoDiaMes[3] = 31;
    iUltimoDiaMes[4] = 30;
    iUltimoDiaMes[5] = 31;
    iUltimoDiaMes[6] = 30;
    iUltimoDiaMes[7] = 31;
    iUltimoDiaMes[8] = 31;
    iUltimoDiaMes[9] = 30;
    iUltimoDiaMes[10] = 31;
    iUltimoDiaMes[11] = 30;
    iUltimoDiaMes[12] = 31;
    
    //Verificar formato dd/mm/aaaa
    String sData = digitado.toString();
    int nTamanho = sData.length();
    
    //System.out.println("Data Digitada ::: " + sData);
    
    //Limitar tamanho a dez posicoes
    if (nTamanho == 10) {
        //---- Verifica se e numero
        String Sequencia = sData.substring(0, 2);
        Dia = Sequencia;
        int tamanhoSequencia = Sequencia.length();
        int chave = 0;
        String valCont = "";
        for (int i = 0; i < tamanhoSequencia; i++) {
            valCont = Sequencia.toString().substring(i, i + 1);
            if ((valCont.equals("0"))
            || (valCont.equals("1"))
            || (valCont.equals("2"))
            || (valCont.equals("3"))
            || (valCont.equals("4"))
            || (valCont.equals("5"))
            || (valCont.equals("6"))
            || (valCont.equals("7"))
            || (valCont.equals("8"))
            || (valCont.equals("9"))) {
                chave = chave;
            } else {
                chave = 1;
            }
        }
        if (chave == 1) {
            bOk = false;
        }
        
        //---- Verifica se e numero
        Sequencia = sData.substring(3, 5);
        Mes = Sequencia;
        tamanhoSequencia = Sequencia.length();
        chave = 0;
        valCont = "";
        for (int i = 0; i < tamanhoSequencia; i++) {
            valCont = Sequencia.toString().substring(i, i + 1);
            if ((valCont.equals("0"))
            || (valCont.equals("1"))
            || (valCont.equals("2"))
            || (valCont.equals("3"))
            || (valCont.equals("4"))
            || (valCont.equals("5"))
            || (valCont.equals("6"))
            || (valCont.equals("7"))
            || (valCont.equals("8"))
            || (valCont.equals("9"))) {
                chave = chave;
            } else {
                chave = 1;
            }
        }
        if (chave == 1) {
            bOk = false;
        }
        
        //---- Verifica se e numero
        Sequencia = sData.substring(6, 10);
        Ano = Sequencia;
        tamanhoSequencia = Sequencia.length();
        chave = 0;
        valCont = "";
        for (int i = 0; i < tamanhoSequencia; i++) {
            valCont = Sequencia.toString().substring(i, i + 1);
            if ((valCont.equals("0"))
            || (valCont.equals("1"))
            || (valCont.equals("2"))
            || (valCont.equals("3"))
            || (valCont.equals("4"))
            || (valCont.equals("5"))
            || (valCont.equals("6"))
            || (valCont.equals("7"))
            || (valCont.equals("8"))
            || (valCont.equals("9"))) {
                chave = chave;
            } else {
                chave = 1;
            }
        }
        if (chave == 1) {
            bOk = false;
        }
        
        if (bOk == true) {
            //Verificar range de dia mes e ano
            int Dia = Integer.parseInt(sData.substring(0, 2));
            int Mes = Integer.parseInt(sData.substring(3, 5));
            int Ano = Integer.parseInt(sData.substring(6, 10));
            
            //Verifica se o ano eh bissexto.
            //Ano bissexto se o ano for multiplo de 4.
            iRestoCalculoAnoBissexto = Ano % 4;
            if (iRestoCalculoAnoBissexto == 0) {
                bAnoBissexto = true;
                iUltimoDiaMes[2] = 29;
            } else {
                bAnoBissexto = false;
            }
            
            //Ano entre 1800 ate 3000
            // if (Ano < 1800 || Ano > 3000) {
            //    sMensagemDataInvalida = "Data inválida ! 

O ano deve estar entre 1800 e 3000.";
// bOk = false;
//} else {
//Mes entre 1 a 12
if (Mes < 1 || Mes > 12) {
sMensagemDataInvalida = “Data inválida !
O mês deve estar entre 1 e 12.”;
bOk = false;
} else {
//Dia entre 1 e 31
if (Dia < 1 || Dia > 31) {
sMensagemDataInvalida =
"Data inválida !
O dia deve estar entre 1 e " + iUltimoDiaMes[Mes];
bOk = false;
} else {
if (Dia > iUltimoDiaMes[Mes]) {
sMensagemDataInvalida =
"Data inválida !
O dia deve estar entre 1 e " + iUltimoDiaMes[Mes];
bOk = false;
}
}
// }
}
}
} else {
bOk = false;
}

    if (bOk == false) {
        // businessObject.controlaLostFocus.setControleLostFocus(false);
        // showDialogs.dlgInformativoOk(sMensagemDataInvalida, "Validação de Data");
        // JOptionPane.showMessageDialog(null, sMensagemDataInvalida, "Validação de Data", JOptionPane.OK_OPTION);
        setMenssagemDataInvalida( sMensagemDataInvalida );
    }else{
        setMenssagemDataInvalida(null);
    }
    
    return bOk;
}[/code]

Valeu, gente… Mas acreditem o erro não estava no meu código :slight_smile: O problema eh que o GregorianCalendar começa a contar os meses a partir de zero (Janeiro=0, fevereiro=1…)… Não tinha como dar certo, né? :slight_smile:
No caso, antes de testar eu preciso diminuir em uma unid. o mes digitado pelo usuário, aí fica blzzzz. :stuck_out_tongue:

[quote=“Cecília”]Valeu, gente… Mas acreditem o erro não estava no meu código :slight_smile: O problema eh que o GregorianCalendar começa a contar os meses a partir de zero (Janeiro=0, fevereiro=1…)… Não tinha como dar certo, né? :slight_smile:
No caso, antes de testar eu preciso diminuir em uma unid. o mes digitado pelo usuário, aí fica blzzzz. :P[/quote]

Potz cecilia…rs… como vc nao sabia disso ??? :?: :lol:

E porque tb no GregorianCalendar os meses estão definidos em variaveis static… :smiley: