segunda-feira, 13 de agosto de 2012

Validar data e hora em Java

 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())));
    }
}

2 comentários:

  1. Verifiquei sua rotina usando um campo, texto formato dd/MM/aaa, vindo de um formulário e o retorno é sempre false

    ResponderExcluir
    Respostas
    1. Nessa rotina é importante notar o seguinte:

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

      Excluir