Segue abaixo método que valida se uma data é válida ou não, se foi preenchida ou não.
Valida data com ou sem hora e se data é válidas, hora é válidas, considerando ano bissexto.
Basta copiar esse método (isValidDate e isEmpty) no seu códido e usar!
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
public class ValidaData {
//Teste do método abaixo isValidDate
public static void main(String[] args){
String dataASerValidada = "30/08/2012";
String dataASerValidada1 = "29/02/2012";
String dataASerValidada2 = "29/02/2011";
String dataASerValidada3 = "31/08/2012 99:11:00";
String dataASerValidada4 = "31/09/2012";
String dataASerValidada5 = "01/03/2012 15:30:25";
String dataASerValidada6 = "";
System.out.println(isValidDate(dataASerValidada, true, false)); // Retorna true
System.out.println(isValidDate(dataASerValidada1, true, false)); // Retorna true
System.out.println(isValidDate(dataASerValidada2, true, false)); // Retorna false
System.out.println(isValidDate(dataASerValidada3, true, true)); // Retorna false
System.out.println(isValidDate(dataASerValidada4, true, false)); // Retorna false
System.out.println(isValidDate(dataASerValidada5, true, true)); // Retorna true
System.out.println(isValidDate(dataASerValidada6, false, false)); // Retorna true
System.out.println(isValidDate(dataASerValidada6, true, true)); // Retorna false
System.out.println(isValidDate(new Date(), true, true)); // Retorna true
}
/**
* Método que valida data com ou sem hora.
* Verifica datas inválidas, horas inválidas, ano bissexto.
* @param object Aceita um parâmetro a ser validado que pode ser String ou Date.
* @param obrigatorio Permite executar validação para campo obrigatório.
* @param dataEHora Permite definir se a data deve ser validada com hora ou sem hora.
* @return true(válido) ou false(inválido)
*/
public static boolean isValidDate(Object object, boolean obrigatorio, boolean dataEHora) {
//Verifica se o objeto passado é string ou java.util.Date
//Preenche a string a ser usada na validação
String dataString = null;
if(object instanceof String){
dataString = object.toString();
} else if (object instanceof Date) {
SimpleDateFormat out = null;
if(dataEHora){
out = new SimpleDateFormat("ddMMyyyyHHmmss");
dataString = out.format(object);
} else {
out = new SimpleDateFormat("ddMMyyyy");
dataString = out.format(object);
}
}
//Verifica se é obrigatório e o campo não foi preenchido
if(obrigatorio && isEmpty(dataString)){
return false;
} else
//Verifica se não for obrigatório e o campo não foi preenchido
if (!obrigatorio && isEmpty(dataString)){
return true;
}
//Retira todos os caracteres que não forem numéricos
dataString = dataString.replaceAll( "[^\\d]", "" );
//Se campo possui hora, deve possuir pelo menos 14 dígitos
if(dataEHora && dataString.length() < 14){
return false;
}
//Se campo não possui hora, deve possuir pelo menos 8 digitos
if(!dataEHora && dataString.length() < 8){
return false;
}
//Pega os valores do dia, mês e ano
Long dia = new Long(dataString.substring(0,2));
Long mes = new Long(dataString.substring(2,4));
Long ano = new Long(dataString.substring(4,8));
Long hora = null;
Long minuto = null;
Long segundo = null;
//Se data tem hora pega os valores de horas, minutos e segundos.
if(dataEHora){
hora = new Long(dataString.substring(8,10));
minuto = new Long(dataString.substring(10,12));
segundo = new Long(dataString.substring(12,14));
}
try{
//Preenche um objeto GregorianCalendar onde a validação acontece
//Inclusive sobre ano bisexto, dia inválido, hora inválida
GregorianCalendar data = new GregorianCalendar();
data.setLenient(false);
data.set(GregorianCalendar.YEAR, ano.intValue());
data.set(GregorianCalendar.MONTH, mes.intValue()-1);
data.set(GregorianCalendar.DATE, dia.intValue());
if(dataEHora){
data.set(GregorianCalendar.HOUR_OF_DAY, hora.intValue());
data.set(GregorianCalendar.MINUTE, minuto.intValue());
data.set(GregorianCalendar.SECOND, segundo.intValue());
}
// A validação da data ocorre aqui
// Caso tenha alguma coisa errada com a data o sistema lança exceção
// Capturada pelo catch abaixo e retorna false
data.getTime();
}
catch(Exception e){
return false;
}
return true;
}
//Método para verificar se string é vazia
public static boolean isEmpty(String s) {
return ((s == null) || ("".equals(s.trim())));
}
}
Verifiquei sua rotina usando um campo, texto formato dd/MM/aaa, vindo de um formulário e o retorno é sempre false
ResponderExcluirNessa rotina é importante notar o seguinte:
Excluir- O segundo parâmetro define se o preenchimento do campo é obrigatório ou não.
- O terceiro parâmetro true define o formato: dd/MM/yyyy HH:mm:ss
- O terceiro parâmetro false define o formato: dd/MM/yyyy
Se for usar um campo no formato dd/MM/aaaa, você deve ter algo assim no código:
String dataASerValidada = "30/08/2012";
isValidDate(dataASerValidada, true, false); // nesse caso o retorno será true.
De repente você passou uma data no formato dd/MM/aaa ou usou true no 3º parâmetro:
isValidDate(dataASerValidada, true, true); // nesse caso o retorno será false, pois o sistema verifica se foi preenchida data e hora correta, caso tenha preenchido somente a data, o retorno é false.
Caso ainda tenha dúvida pergunte novamente.