a parte do fevereiro do ano bissexto eh a mais legal :mrgreen:
não é complicado, você começa com uma array pra indicar quantos dias tem cada mês, aí valida o ano (tem que ser número positivo), depois valida o mês, depois valida o dia (aqui você inclui o bissexto caso seja).
Como você faz a conversão entre a string que o usuário digita para um objeto date? Você está usando Swing? Ou é ambiente web? Está usando algum framework? Ou está fazendo a tranformação na mão utilizando protocolo SPCSPL*?
Eu to consciente que reinventei a roda, mas segue um exemplo de codigo de validação de datas que eu uso aqui no sistema.
/**
* Nome: dataInvalida <br>
* Propósito: Verifica se a data é válida <br>
* Parâmetros:
* @param data - data a ser validada string
* @return true se houver erro e false se não houver
*/
public static boolean dataInvalida (String data) {
boolean dataInvalida = true;
String validaDia28 = "(0[1-9]|[12][0-8])";
String validaDia29 = "(0[1-9]|[12][0-9])";
String validaDia30 = "(0[1-9]|[12][0-9]|30)";
String validaDia31 = "(0[1-9]|[12][0-9]|3[01])";
String validaMes = "(0[1-9]|1[0-2])";
String validaAno = "([0-9]{4})";
String mesCom31 = "(0[13578]|1[02])";
String fevereiro = "(02)";
String barra = "/";
String exprInicial = validaDia31 + barra + validaMes + barra + validaAno;
String exprFinal = exprInicial;
if (Pattern.matches(exprInicial, data)) {
StringTokenizer tokenizer = new StringTokenizer(data, barra);
//String dataArray[] = data.split("/"); Não funciona no JDK 1.3
String dia = tokenizer.nextToken(); //dataArray[0];
String mes = tokenizer.nextToken(); //dataArray[1];
String ano = tokenizer.nextToken(); //dataArray[2];
String exprDia = validaDia30;
if (Pattern.matches(mesCom31 , mes)) {
exprDia = validaDia31;
} else {
if (Pattern.matches(fevereiro, mes)) {
if (eBissexto(Integer.parseInt(ano))) {
exprDia = validaDia29;
} else {
exprDia = validaDia28;
}
}
}
exprFinal = exprDia + barra + validaMes + barra + validaAno;
if (Pattern.matches(exprFinal, data)) {
dataInvalida = false;
}
}
return dataInvalida;
}
/**
* Nome: eBissexto <br>
* Propósito: verifica se o ano passado é bissexto ou não <br>
* Parâmetros:
* @param ano - ano a ser verificado se é bissexto
* @return true se bissexto e false se não
*/
private static boolean eBissexto(int ano) {
boolean bissexto = false;
if (((ano % ConstantesNumericas.NUMERO_4) == 0
&& (ano % ConstantesNumericas.NUMERO_100) != 0)
|| (ano % ConstantesNumericas.NUMERO_400) == 0) {
bissexto = true;
}
return bissexto;
}
Existem algumas adaptações já que não podemos usar por aqui nem a classe Pattern nem o String.split() por não estrem presente no JDK 1.3, mas funciona perfeitamente.
por exemplo: eu tenho uma aplicação que possui um campo onde o usuário pode digitar datas… mas se o usuário digitar uma data do tipo 10/13/2005 o java transforma para 10/01/2006… ou se o usuário digita 31/02/2005 o java transforma para 01/03/2005… existe alguma função em Java que faça a validação dessas datas… ou seja que eu possa informar ao usuário que fevereiro só vai até o dia 28 ou 29 (em ano bissexto)? Ou diga que o mês 13 não existe?