Validação de Data

Ola galera gostaria sa saber se alguem tem um algoritimo que valida data: o meu algoritimo ja valida no seguite formato dd/mm/aaaa
o unico problema é que se eu colocar 40/90/5000 ele aceita ou seja soh valida o formato mesmo , algm tem um algoritimo que faça
a validação da data mesmo ?

obrigado!

Como vc faz a validação hoje? A data vem em formato String?

Poste seu código, para facilitar a ajuda.

Att

Estou Fazendo Assim Amigão

 if (!StringUtil.isEmpty(dadosTitulos.getTxVencimento().getText())) {

                if (dadosTitulos.getTxVencimento().getText().indexOf("/") != 2) {
                    dadosTitulos.getTxVencimento().setBorder(errorBorder);
                    MessageUtil.errorMessage("REQUIRED_FIELDS");
                    SwingUtilities.invokeLater(new Runnable() {

                        @Override
                        public void run() {
                            dadosTitulos.getTxVencimento().requestFocus();
                        }
                    });
                    return true;
                }
                if (dadosTitulos.getTxVencimento().getText().lastIndexOf("/") != 5) {
                    dadosTitulos.getTxVencimento().setBorder(errorBorder);
                    MessageUtil.errorMessage("REQUIRED_FIELDS");
                    SwingUtilities.invokeLater(new Runnable() {

                        @Override
                        public void run() {
                            dadosTitulos.getTxVencimento().requestFocus();
                        }
                    });
                    return true;
                }
                if (dadosTitulos.getTxVencimento().getText().length() != 10) {
                    dadosTitulos.getTxVencimento().setBorder(errorBorder);
                    MessageUtil.errorMessage("REQUIRED_FIELDS");
                    SwingUtilities.invokeLater(new Runnable() {

                        @Override
                        public void run() {
                            dadosTitulos.getTxVencimento().requestFocus();
                        }
                    });

                    return true;
                }

            } else {
                dadosTitulos.getTxVencimento().setBorder(errorBorder);
                MessageUtil.errorMessage("REQUIRED_FIELDS");
                SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        dadosTitulos.getTxVencimento().requestFocus();
                    }
                });
                return true;
            }
           }

Julio,

Do jeito que você está fazendo, está comparando posições na String para definir se representa um formato de data, logo tem a regra de dia/mes valido.

Você tem duas opcoes, ou tratar isto (Péssima ideia).
Ou utilizar classes do java que ja fazem isto para você

No caso o campo getTxVencimento(), tem a representação de uma data, logo é so criar um metodo que pega o conteúdo deste campo e valide.
Segue abaixo um exemplo

public static boolean isDataValida(String date) { try { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); sdf.setLenient(false); sdf.parse(date); } catch (ParseException e) { return false; } return true; }
Depois é so utilizar no seu código, onde você não vai ficar precisando validar mais a posição, pois o método acima valida se a data é valida, em sua formatação e nas regras de dias/meses.

Att

cara segue esse comando muito facil de usar só colca no seu codigo ja era

[code]package util.Data;

import java.util.GregorianCalendar;

public class ValidaData {

public ValidaData() {   
}   
//public static void main(String[] s) {   
// System.out.println(validaData("22/09/2010"));       
// }   

public static boolean validaData(String data) {  

	GregorianCalendar calendar =  new GregorianCalendar();     
	int dia = 0,mes = 0,ano = 0;   

	String diaStr = data.substring(0,2);   
	String mesStr = data.substring(3,5);   
	String anoStr = data.substring(6,10);   

	try {   
		dia = Integer.parseInt(diaStr);   
		mes = Integer.parseInt(mesStr);   
		ano = Integer.parseInt(anoStr);   
	} catch (Exception e) {   
		return false;   
	}   
	if (dia < 1 || mes < 1 || ano < 1)   
		return false;   
	else   
		if (mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12)   
			if (dia <= 31)   
				return true;   
			else   
				return false;   
		else   
			if (mes == 4 || mes == 6 || mes == 9 || mes == 11)   
				if (dia <= 30)   
					return true;   
				else   
					return false;   
			else   
				if (mes == 2)   
					if (calendar.isLeapYear(ano))   
						if (dia <= 29)   
							return true;   
						else   
							return false;   
					else   
						if (dia <= 28)   
							return true;   
						else   
							return false;   
				else   
					if (mes > 12)   
						return false;   
	return true;   
}   

} [/code]

valeu!

lokit"s

Utilizar a API do java é melhor, pois o método já foi testado por muitas pessoas, sempre vai ter melhorias de performance, entre outras razões de se utilizar a API.

O código postado por você apesar de funcional, é necessário no minimo um case test para verificar se isto funciona da maneira correta. Isto atrasa o desenvolvimento, e pode trazer alguns bugs complicados de resolver na aplicação.

Então fica como dica, sempre prefira a API.

Att

Galera legal a dica estou usando a classe simple data format porem estou com uma duvida
como faço a seguinte comparação ?

a data que sera digitada no campo nao pode ser maior que 20/04/2020 e nao pode ser menor que 20/04/1991

  if ((dadosTitulos.getTxDataLimiteDesc().getText())< (simpleDateFormat(20/04/1991))||dadosTitulos.getTxDataLimiteDesc().getText()>  (simpleDateFormat(20/04/2020)){
      MessageUtil.errorMessage("DATA_ INVALIDA");
}

galera esse é soh um exemplo que nao funciona mas gostaria que me mostrassem uma sintaxe que funcionasse, obrigado.

Segue um exemplo:

[code]import java.text.SimpleDateFormat;
import java.util.Calendar;
public class CompareDate {

public static void main(String args[]) {
    Calendar cal = Calendar.getInstance();
    Calendar currentcal = Calendar.getInstance();
    cal.set(1991, Calendar.APRIL, 20);
    currentcal.set(currentcal.get(Calendar.YEAR),currentcal.get(Calendar.MONTH), currentcal.get(Calendar.DAY_OF_MONTH));

    if (cal.before(currentcal)) {
        System.out.print("A data atual (" + new SimpleDateFormat("dd/MM/yyyy").format(currentcal.getTime()) + ") é maior que a data " + new SimpleDateFormat("dd/MM/yyyy").format(cal.getTime()));
    } else if (cal.after(currentcal)) {
        System.out.print("A data atual(" + new SimpleDateFormat("dd/MM/yyyy").format(currentcal.getTime()) + ") é menor que a data " + new SimpleDateFormat("dd/MM/yyyy").format(cal.getTime()));
    } else {
        System.out.print("As duas datas são iguais.");
    }
}

}[/code]