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

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?

Dê uma olhada nas classes DateFormat, SimpleDateFormat.

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]);
		}
	}
}
SimpleDateFormat seuPadrao = new SimpleDateFormat("dd/MM/yyyy");
Date data = seuPadrao.parse("13/03/1983");

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.

pense em expressões regulares :wink:

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

        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 !

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!!

Tente assim:

[code] 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");
	}[/code]

[quote=Roger75]Tente assim:

[code] 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");
	}[/code][/quote]

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.

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);
            }
1 curtida

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

qualquer coisa estamos ae! :slight_smile:

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:

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

E não era pra aceitar???

[quote]

[code]
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");
	}

[/code][/quote]

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

E não era pra aceitar???

[quote]

[code]
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");
	}

[/code][/quote]

PQP !!! O que que é isso??? Pelamordedeus…[/quote]

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

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…