Re: validação de datas

acho que não… eu já fiz algo parecido

que tal você fazer a sua agora???

a parte do fevereiro do ano bissexto eh a mais legal :mrgreen:

não é complicado, você começa com uma array pra indicar quantos dias tem cada mês, aí valida o ano (tem que ser número positivo), depois valida o mês, depois valida o dia (aqui você inclui o bissexto caso seja).

boa sorte!

:mrgreen:

http://java.sun.com/j2se/1.4.2/docs/api/java/text/DateFormat.html#setLenient(boolean)

Mude o valor para false que resolve. Ao parsear datas como você falou uma exceção será lançada.

existe algo que faz isso de colocar 13 pra 1 ??? :shock:

Como você faz a conversão entre a string que o usuário digita para um objeto date? Você está usando Swing? Ou é ambiente web? Está usando algum framework? Ou está fazendo a tranformação na mão utilizando protocolo SPCSPL*?

[size=9]* String Pra Cá String Pra Lá - cv[/size]

Olá pessoal,

Eu to consciente que reinventei a roda, mas segue um exemplo de codigo de validação de datas que eu uso aqui no sistema.

    /**
     * Nome: dataInvalida <br>
     * Propósito: Verifica se a data é válida <br>
     * Parâmetros:
     *      @param data - data a ser validada string  
     *      @return true se houver erro e false se não houver 
    */
    public static boolean dataInvalida (String data) {
        boolean dataInvalida = true;
        String validaDia28 =   "(0[1-9]|[12][0-8])";
        String validaDia29 =   "(0[1-9]|[12][0-9])";
        String validaDia30 =   "(0[1-9]|[12][0-9]|30)";
        String validaDia31 =   "(0[1-9]|[12][0-9]|3[01])";
        String validaMes =     "(0[1-9]|1[0-2])";
        String validaAno =     "([0-9]{4})";
        String mesCom31 =      "(0[13578]|1[02])";
        String fevereiro =     "(02)";
        String barra = "/";
            
        String exprInicial = validaDia31 + barra + validaMes + barra + validaAno;
        String exprFinal = exprInicial;
            
        if (Pattern.matches(exprInicial, data))  {
            StringTokenizer tokenizer = new StringTokenizer(data, barra);
            //String dataArray[] = data.split("/"); Não funciona no JDK 1.3
            String dia = tokenizer.nextToken(); //dataArray[0];
            String mes = tokenizer.nextToken(); //dataArray[1];
            String ano = tokenizer.nextToken(); //dataArray[2];
            String exprDia = validaDia30;
            
            if (Pattern.matches(mesCom31 , mes)) {
                exprDia = validaDia31;
            }   else    {
                if (Pattern.matches(fevereiro, mes))    {
                    if (eBissexto(Integer.parseInt(ano))) {
                        exprDia = validaDia29;  
                    }   else    {
                        exprDia = validaDia28;
                    }
                }
            }
            
            exprFinal = exprDia + barra + validaMes + barra + validaAno;
            if (Pattern.matches(exprFinal, data))    {
                dataInvalida = false;
            }   
        }
        return dataInvalida;   
    }

    /**
     * Nome: eBissexto <br>
     * Propósito: verifica se o ano passado é bissexto ou não <br>
     * Parâmetros:
     * 		@param ano - ano a ser verificado se é bissexto
     * 		@return true se bissexto e false se não
    */
    private static boolean eBissexto(int ano) {
        boolean bissexto = false;
        if (((ano % ConstantesNumericas.NUMERO_4) == 0 
                && (ano % ConstantesNumericas.NUMERO_100) != 0) 
                || (ano % ConstantesNumericas.NUMERO_400) == 0) {   
            bissexto = true;
        }   
        return bissexto;    
    }

Existem algumas adaptações já que não podemos usar por aqui nem a classe Pattern nem o String.split() por não estrem presente no JDK 1.3, mas funciona perfeitamente.

Abraços
Gabriel Thiesen

Aaaaah então é o struts que está fazendo a conversão pra você? … hum …

por exemplo: eu tenho uma aplicação que possui um campo onde o usuário pode digitar datas… mas se o usuário digitar uma data do tipo 10/13/2005 o java transforma para 10/01/2006… ou se o usuário digita 31/02/2005 o java transforma para 01/03/2005… existe alguma função em Java que faça a validação dessas datas… ou seja que eu possa informar ao usuário que fevereiro só vai até o dia 28 ou 29 (em ano bissexto)? Ou diga que o mês 13 não existe?

ainda sou iniciante em java… vc tem algum exemplo deste

setLenient

?

é ambiente WEB, utilizo Struts/Hibernate… mas já peguei um exemplo… Valeu