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

9 respostas
C

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?

9 Respostas

I

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…

C

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

C

É 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…

I

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

Ironlynx

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:

Marques

Tente o seguinte:

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

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

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;
    }
C

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:

brlima

“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

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

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

Criado 21 de dezembro de 2003
Ultima resposta 22 de dez. de 2003
Respostas 9
Participantes 5