Validação de Data

6 respostas
Zeed01

Boa noite Colegas !

O usuário digita um dado num JTextBox, como verificar que foi digitada uma data válida ?
Entender por data valida: DD/MM/YY ou DD/MM/YYYY.

Resumindo: tendo uma string, como verificar que é uma data válida ?

Obrigado a todos.

[]s

6 Respostas

AndreAlves

Eu uso o SimpleDateFormat do pacote java.text
Não testei o código, mas acho que isso aqui vai funcionar legal:

public boolean ehDataValida(String valor) {
	boolean valida = true;

	try {
        	DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        	Date date = (Date)formatter.parse(valor);
	} catch(ParseException e) {
		valida = false;
	}

	return valida;
}
Zeed01

Boa noite colegas !

AndreAlves:

Antes de mais nada obrigado pela dica, valeu !

Mas eu implementei o método e não funcionou da maneira que eu esperada.

Estou recebendo um ParseException na linha

Date date = (Date) formatter.parse(data);

A string que estou passando é “10/05/2007”.

Sabe me dizer o que pode estar errado ?

Esse é o meu código:

public boolean verify(JComponent cp){
        boolean result = true; 	
        JTextField dataText = (JTextField) cp;        
        
        boolean badFormat = false;
        10/05/2007
        if (dataText.getText() != null && dataText.getText().length() > 0) {
            if (dataText.length() == 8) {
                if ( !(dataText.substring(2, 2).equals("/") || data.substring(5, 5).equals("/")) ) { 					
                        dataText = dataText.substring(0, 1) + "/" + dataText.substring(2, 3) + "/" + dataText.substring(4,8);
                } else {
                    badFormat = true;
                }
            } else if (data.length() == 10) {
                if (!(data.substring(2, 2).equals("/") && data.substring(5, 5).equals("/"))) { 					
                    badFormat = true;			
                }
            } else {		
                badFormat = true;
            }
        } 
 	
        if ( badFormat ) {
            JOptionPane.showMessageDialog(null,"Digite a data no formato DD/MM/AAAA", "Erro",
                                            JOptionPane.ERROR_MESSAGE);
            result = false;		
        } else if ( data.length() > 0 ) {		
            try {
                DateFormat formatter = new SimpleDateFormat("##/##/####");
                Date date = (Date) formatter.parse(dataText);
            } catch (ParseException e){
                System.out.println(e.getMessage());
                System.out.println(dataText);
                result = false;
            }

            if (! result) {
                JOptionPane.showMessageDialog(null, "Data inválida.", "Erro",
                                              JOptionPane.ERROR_MESSAGE);
                result = false;		
            }  	
            return result;
    }    
}

No print que estou dando no Exceptio sai:

Unparseable date: “10/05/2007”
10/05/2007

Então acho que estou passando o parametro correto para o parse…

Obrigado a todos.

[]s

fabim
public static boolean isParseableDate( String data ) {
		
	SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
	formatador.setLenient( false );
		
	try {
		formatador.parse( data );
		return true;
	} catch ( Exception e ) {
		return false;
	}
		
}
Zeed01

Boa tarde colegas !

fabiocsi:

Agora rolou 100% ! Valeu !

Obrigado a todos os outros que ajudaram também !

Agora Fábio, se puder me explicar umas coisinhas…

O método verify recebe um Component como argumento.

Esse componente é o JTextField que eu setei como
data.setInputVerifier(new DataInputVerifier());

certo ?

Existe algum método equivalente ao getText() no Component ?

Porque eu tive que colocar essas linhas pra conseguir pegar o valor:

JTextField textFieldTemp = (JTextField) cp;
String data = textFieldTemp.getText();

Outra coisa… não entendi em que parte do método eu estou devolvendo o valor formatado para o JTextField da tela…
Bom, na verdade sei que isso esta sendo feito nas linhas:

data = data.substring(0, 2) + "/" + data.substring(2, 4) + "/" + data.substring(4);
textFieldTemp.setText(data);

Mas não entendi como…

Este é o método verify que criei baseado na dica do outro tópico que você passou antes:

public boolean verify(JComponent cp){
        boolean result = true; 	
        JTextField textFieldTemp = (JTextField) cp;
        String data = textFieldTemp.getText(); 		
        boolean badFormat = false;
        boolean aceitaDataPosteriorAtual = false;
 
        if (data != null && data.length() > 0) {
            if (data.length() == 8) {
                if ( !(data.substring(2, 3).equals("/") || data.substring(5, 6).equals("/")) ) { 					
                        data = data.substring(0, 2) + "/" + data.substring(2, 4) + "/" + data.substring(4);
                        textFieldTemp.setText(data);
                } else {
                    badFormat = true;
                }
            } else if (data.length() == 10) { 				
                if (!(data.substring(2, 3).equals("/") && data.substring(5, 6).equals("/"))) { 					
                    badFormat = true;			
                }		
            } else {		
                badFormat = true;
            }
        } 
 	
        if ( badFormat ) {		
            JOptionPane.showMessageDialog(null,"Digite a data no formato DD/MM/AAAA", "Erro",
                                            JOptionPane.ERROR_MESSAGE);
            result = false;		
        } else if ( data.length() > 0 ) {		
            SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
            formatador.setLenient( false );
 		
            try {
                formatador.parse( data );
                result = true;
            } catch ( Exception e ) {
                result = false;
            }
            
            if (! result) {
                JOptionPane.showMessageDialog(null, "Data inválida.", "Erro",
                                              JOptionPane.ERROR_MESSAGE);
            } else if (!aceitaDataPosteriorAtual) {
                //try {
                    //Timestamp dataDigitada = Util.formataStringToDate(data);
                    //Timestamp dataDigitada = data;
                    //Timestamp dataAtual = Util.dataAtual();
                    //if (dataDigitada.after(dataAtual)) {
                    //        JOptionPane.showMessageDialog(null,
                    //                        "Data não pode ser superior à data atual.", "Erro",
                    //                        JOptionPane.ERROR_MESSAGE);
                    //        result = false;
                    result = true;
                //    }		
 		//} catch (Exception exc) {
                //    exc.printStackTrace();
 		//}
 	
            } 			
        }
 	return result;
    }

A parte do "aceitaDataPosteriorAtual
esta comentada porque esta dando erro… acho que não tenho o pacote Util

Um abraço e muito obrigado novamente pela ajuda !

fabim

é cara, realmente qdo criei isso ai acabei amarrando com a minha classe Util, entao ficou um poco acoplada… sorry mas vc pode criar um InputVerifier decente, que aceite não so Datas, mas tb CPF, telefones etc…

ai vc poderia fazer algo do tipo:

textField.setInputVerifier( new SeuInputVerifier( SeuInputVerifier.CPF ) );
textField.setInputVerifier( new SeuInputVerifier( SeuInputVerifier.DATA ) );

Zeed01

Boa noite colegas !

Fabio,

Você me aconselha a criar uma única classe que faça diversos tipo de validações ?

Dessa maneira a validação seria de CPF e DATA, por exemplo, seriam separadas por IF´s ??

Valeu !

Abraços

Criado 26 de julho de 2007
Ultima resposta 30 de jul. de 2007
Respostas 6
Participantes 3