Como descobrir se uma data existe? <RESOLVIDO>

9 respostas
maior_abandonado

bom pessoal...eu tenho uma APP que pode receber datas em varias mascaras, e o user seleciona uma mascara na jcombobox para verificar se a data existe naquela mascara...

o problema é que por exemplo na mascara "DDMMAA", e data "320198" ta retornando dia 1 do mes seguinte...

eu queria algum metodo que me retornasse isso..é possivel de alguma forma humana ou eu vo ter q escovar bits até falar chega mesmo???

segue o metodo que estou usando, para teste ainda:

public boolean isDate(String formato, String conteudo){
        try{
            formato = formato.replace('A','y');
            formato = formato.replace('D','d');
            System.out.println(formato);
            SimpleDateFormat f = new SimpleDateFormat(formato);
            
            Date data = f.parse(conteudo);   
            
            int dia = data.getDate();
            int mes = data.getMonth();
            int ano = data.getYear();
            System.out.print("\ndia: "+dia);
            System.out.print("\nmes: "+mes);
            System.out.print("\nano: "+ano);
            
            Calendar agora = Calendar.getInstance();
            agora.setTime(data);
            
        }catch(ParseException pe){
            System.out.println(pe.getMessage());
            pe.getMessage();
        }
        
        return false;
    }

euchamo esse metodo assim: obj.isDate("DDMMAA", "320198");

e a saida fico assim:

init:
deps-jar:
compile-single:
run-single:
ddMMyy

dia: 1
mes: 1
ano: 98
BUILD SUCCESSFUL (total time: 0 seconds)

quando eu coloco mes 1 ele me retorna 0... (parece q começa do zero e ai vai até o 11...eu não sabia...)
agradeço qualquer ajuda ai ...

9 Respostas

71C4700

Cara nao lembro direito, mas os meses começam em 0 ate 11.
Quando voltar vejo se lembro e posto por aqui !
Abraços

brlima
GregorianCalendar.JANUARY;
        GregorianCalendar.FEBRUARY;

E assim vai…

maior_abandonado

brlima:
GregorianCalendar.JANUARY; GregorianCalendar.FEBRUARY;

E assim vai…

não intendimto bem o que vc quis dizer… vc esta sujerindo para eu ver na mascara onde esta os meses e ver se é menor do que 12, os dias e ver se é menor do que a quantidade de dias dakele mes…etc etc e mais etc??? (era justamente o que eu keria evitar… o que eu tava pretendendo era algo do tipo uma classe que eu instanciasse com uma data inicial, ou algo do tipo e ele gerasse um exception caso a data não exista, ou algum tipo de metodo isValid, ou algo do tipo… resumindo eukeria ver se ja existe isso q falei ai atras ja implementado… ou se eu vo ter q criar do zero…)

não conheço essa classe GregorianCalendar… teria como vc me da um exemplo?? era isso emsmoq eu falei acima?

sergiotaborda

maior_abandonado:
bom pessoal…eu tenho uma APP que pode receber datas em varias mascaras, e o user seleciona uma mascara na jcombobox para verificar se a data existe naquela mascara…

o problema é que por exemplo na mascara “DDMMAA”, e data “320198” ta retornando dia 1 do mes seguinte…

eu queria algum metodo que me retornasse isso…é possivel de alguma forma humana ou eu vo ter q escovar bits até falar chega mesmo???

Por padrão o calendar encontra a data real mais proxima. Para que isso não aconteca use o método setLinient(false) para que o Calendar dar erro quando a data não existe. Caputrando a exceção vc pode saber se a data existe ou não

maior_abandonado

valeu sergio… era isso mesmo q eu tava procurando…ao q eu intendi do q vc esplico…

eu vo tenta resolver aki e ja retorno…obrigadão

maior_abandonado

pessoal...mals ae a demora...

então...o metodo passadopelo sergio funcionou, porem assim eu estou limitado as mascaras com 2 digitos...

public boolean isDate(String formato, String conteudo){
     
            formato = formato.replace('A','y');
            formato = formato.replace('D','d');
            Calendar data = Calendar.getInstance();
            data.setLenient(false);
            
            String dia = "", mes = "", ano = "";
            for (int i = 0;i<conteudo.length();i++){
                if (formato.substring(i, i+1).equals("d")){
                    dia+=conteudo.substring(i, i+1);
                }if (formato.substring(i, i+1).equals("M")){
                    mes+=conteudo.substring(i, i+1);
                }if (formato.substring(i, i+1).equals("y")){
                    ano+=conteudo.substring(i, i+1);
                }
            }
            
            System.out.print("\ndia: "+dia);
            System.out.print("\nmes: "+mes);
            System.out.print("\nano: "+ano+"\n\n");
            
            data.setLenient(false);
            
         try{   
            data.set(Integer.parseInt(ano), Integer.parseInt(mes)-1, Integer.parseInt(dia));
            

            System.out.println("dia: "+data.get(Calendar.DAY_OF_MONTH));
            System.out.println("mes: "+data.get(Calendar.MONTH));
            System.out.println("ano: "+data.get(Calendar.YEAR));
            
            
            System.out.println("\n\n\ndata existente");
            
            return true;
        }catch(IllegalArgumentException ile){
            System.out.println("data inexistente");
            return false;
        }

tem algum jeito de fazer isso passando um ano com 4 digitos no .set(...) do meu objeto Calendar? >

maior_abandonado

aeee pessoal...acho q resolvi...

simplesmente torquei o .set passando apenas o que quero, no caso o dia e o mes... (depois ainda vo edita verificando o ano se esta correto...

fiz essa troca:

//data.set(Integer.parseInt(ano), Integer.parseInt(mes)-1, Integer.parseInt(dia));
            data.set(Calendar.MONTH, Integer.parseInt(mes)+1);
            data.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dia));
sergiotaborda

tem algum jeito de fazer isso passando um ano com 4 digitos no .set(…) do meu objeto Calendar? >

se o numero que a pessoas passou tem 2 digitos adiciona mais 2. por exemplo 34 -> 1934
Não é correto deixar apenas dois digitos, mas vc é que sabe.

maior_abandonado
sergiotaborda:

tem algum jeito de fazer isso passando um ano com 4 digitos no .set(...) do meu objeto Calendar? >

se o numero que a pessoas passou tem 2 digitos adiciona mais 2. por exemplo 34 -> 1934
Não é correto deixar apenas dois digitos, mas vc é que sabe.

é que o programa deve deve vir preparado pra ambos os formatos de datas... eu vo fazer o que vc falo...
eu testei aki e funciono numa boa... fica ai em baixo caso alguem precise depois...

vlw sergio
try{  
            if (ano.length()>2){
                data.set(Integer.parseInt(ano.substring(ano.length()-2, ano.length())), Integer.parseInt(mes)-1, Integer.parseInt(dia));
            }else{
                data.set(Integer.parseInt(ano), Integer.parseInt(mes)-1, Integer.parseInt(dia));
            } 
            data.setLenient(false);
            //se eu não fazer essas proximas 4 linhas ai ou usar esses valores de alguma forma não da exceção
            int geraErro;
            geraErro = data.get(Calendar.DAY_OF_MONTH);
            geraErro = data.get(Calendar.MONTH);
            geraErro = data.get(Calendar.YEAR);
            
            System.out.println("\n\n\ndata existente");
            
            return true;
        }catch(IllegalArgumentException ile){
            System.out.println("data inexistente");
            return false;
        }
Criado 22 de julho de 2008
Ultima resposta 24 de jul. de 2008
Respostas 9
Participantes 4