Validar data a partir de uma string "00/00/0000"

16 respostas
P

Pessoal recebo de um jTextField um campo String com o seguinte formato:dd/mm/aaaa, o meu problema agora é validar no Java se o cara digitou o dia e mes dentro dos limites (se possível levando em conta se o ano é bixesto).

Isso é possível?

16 Respostas

B

Dê uma olhada nas classes DateFormat, SimpleDateFormat.

G

Então se você estiver trabalhando com Strings você pode usar

public class TesteDeSplit {
	public static void main(String[] args) {
		String[] data = "13/07/2006".split("/");
		
		for(int i=0;i<data.length;i++){
			System.out.println(data[i]);
		}
	}
}
S
SimpleDateFormat seuPadrao = new SimpleDateFormat("dd/MM/yyyy");
Date data = seuPadrao.parse("13/03/1983");
P

Pessoal eu tentei implementar os exemplos de vcs mas nenhum retornou o que eu preciso. Na verdade eu preciso que se o usuário digitar “11/20/2006” por exemplo eu tenha como pegar via exception por exemplo que a data está incorreta para poder avisar o usuário.

P

pense em expressões regulares :wink:

ou tente fazer um new Date dentro de um try catch :wink:

S
Date data = null;
    	String dataTexto = new String("10/30/2006");
    	SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
    	try {
    		format.setLenient(false);
    		data = format.parse(dataTexto);
    	} catch (ParseException e) {
    		JOptionPane.showMessageDialog(null,"O Mané escreveu a data Errada","AVISO",JOptionPane.WARNING_MESSAGE);
    	}

faz isso ae !
até se o dia nao estiver no mês, ele vai gritar !!!
não muda a mensagem no teu programa ta, hehe !

G

Bom há classes que fazem isso para você, mas não sei se você viu, mas você pode criar sua própria Exception por exemplo se o mês(índice 1 do meu exemplo) é inválido.

if (data[1] <1 | data[1] > 12){
   throw new IllegalArgumentException
}

Se você gostou da minha idéia continue postando nesse tópico que a gente vê junto essas classes!

Mas compensa mais usar uma classe pronta para isso!!!

Mas segue mais uma maneira!!

R

Tente assim:

String text="32/12/1983";
		

		String DatePattern = "^(?:(31)(\D)(0?[13578]|1[02])\2|(29|30)(\D)(0?[13-9]|1[0-2])\5|(0?[1-9]|1\d|2[0-8])(\D)(0?[1-9]|1[0-2])\8)((?:1[6-9]|[2-9]\d)?\d{2})$|^(29)(\D)(0?2)\12((?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:16|[2468][048]|[3579][26])00)$";
		if ( text.matches(DatePattern) ) {
			System.out.println("valid date");
		}else{
			System.out.println("not a valid date");
		}
S
Roger75:
Tente assim:
String text="32/12/1983";
		

		String DatePattern = "^(?:(31)(\D)(0?[13578]|1[02])\2|(29|30)(\D)(0?[13-9]|1[0-2])\5|(0?[1-9]|1\d|2[0-8])(\D)(0?[1-9]|1[0-2])\8)((?:1[6-9]|[2-9]\d)?\d{2})$|^(29)(\D)(0?2)\12((?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:16|[2468][048]|[3579][26])00)$";
		if ( text.matches(DatePattern) ) {
			System.out.println("valid date");
		}else{
			System.out.println("not a valid date");
		}
tirem as crianças da sala, ou melhor crianças não facam isso !!! vou colocar o codigo bonitinho e funcional denovo:
Date data = null;
String dataTexto = new String("10/30/2006");
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
try {
     	format.setLenient(false);
     	data = format.parse(dataTexto);
} catch (ParseException e) {
     	JOptionPane.showMessageDialog(null,"O Mané escreveu a data Errada","AVISO",JOptionPane.WARNING_MESSAGE);
}

o setLenient(boolean) vai resolver o seu problema, ele como false nao vai deixar que uma data do tipo: 30/13/2006 se torne um 30/01/2007.

P

Pessoal valeu mesmo.

A solução que eu implementei foi essa:

Date data = null;
            String dataTexto = new String(jTextFieldDataVencimento.getText());
            SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
            try {
                    format.setLenient(false);
                    data = format.parse(dataTexto);
            } catch (ParseException e) {
     		JOptionPane.showMessageDialog(null,
                        "Data inválida. Tente novamente!",
                        "AVISO",
                        JOptionPane.WARNING_MESSAGE);
            }
S

hehe!
com a mensagem do Mané ele nunca mais iria fazer isso denovo!

qualquer coisa estamos ae! :slight_smile:

P

Deixei a mensagem original e fiz um teste pro pessoal aqui.

Todo mundo aprovou esse novo padrão de mensagens de erro, mas por hora não podemos implementar. :lol:

J

galera , fiz dessa forma mas a data 03/3/96 por exemplo ele aceita

T
jonaslc:
galera , fiz dessa forma mas a data 03/3/96 por exemplo ele aceita

E não era pra aceitar???

String text="32/12/1983";
		

		String DatePattern = "^(?:(31)(\D)(0?[13578]|1[02])\2|(29|30)(\D)(0?[13-9]|1[0-2])\5|(0?[1-9]|1\d|2[0-8])(\D)(0?[1-9]|1[0-2])\8)((?:1[6-9]|[2-9]\d)?\d{2})$|^(29)(\D)(0?2)\12((?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:16|[2468][048]|[3579][26])00)$";
		if ( text.matches(DatePattern) ) {
			System.out.println("valid date");
		}else{
			System.out.println("not a valid date");
		}

PQP !!! O que que é isso??? Pelamordedeus...

J
thegoergen:
jonaslc:
galera , fiz dessa forma mas a data 03/3/96 por exemplo ele aceita

E não era pra aceitar???

String text="32/12/1983";
		

		String DatePattern = "^(?:(31)(\D)(0?[13578]|1[02])\2|(29|30)(\D)(0?[13-9]|1[0-2])\5|(0?[1-9]|1\d|2[0-8])(\D)(0?[1-9]|1[0-2])\8)((?:1[6-9]|[2-9]\d)?\d{2})$|^(29)(\D)(0?2)\12((?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:16|[2468][048]|[3579][26])00)$";
		if ( text.matches(DatePattern) ) {
			System.out.println("valid date");
		}else{
			System.out.println("not a valid date");
		}

PQP !!! O que que é isso??? Pelamordedeus...

Então, eu queria que não aceitasse, só aceitasse 03/03/1996 e não 03/3/96, será que tem como??

T

Bom, daí acho que você terá que usar expressões regulares mesmo. “Parecido” com aquela mega-expressão-montruosa-assombrosa-macabra da primeira página… Porque 4/4/2008 não deixa de ser uma data válida…

Criado 13 de julho de 2006
Ultima resposta 4 de abr. de 2008
Respostas 16
Participantes 8