Validação de data

4 respostas
Ziguifrid

Olá,

Vamos a dúvida.

Tenho um campo formatado, com a mascara ##/##/####

E simplesmente quero ver se a data digitada é válida, só que usando a classe DATA2.

O que acontece.

Quando por exemplo digito 32/01/2012 o dia 32 se transforma em dia 1.

A pergunta é por que isto acontece?

Tela principal

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        try {
            
            DateFormat formatter = new SimpleDateFormat("dd/mm/yyyy");//formatar dia
            //formatter.setLenient(false);
            data = (Date) formatter.parse(JFDATA.getValue().toString());
            //data mostra este formato data Wed Jun 06 00:00:00 BRT 2012
            String formatodata = "dd/mm/yyyy";
            String dataaux1=formatter.format(data);//transforma date em String
            
            DATA2 m = new DATA2();
            boolean teste = m.isThisDateValid(dataaux1, formatodata);
            System.out.println("teste "+teste);
            //Validar datas
            //DATA validar = new DATA();
            //validar.validata(dataaux1);
                    
        } catch (Exception e) {
            /*Alguns erros de data cairam aqui
             * Por exemplo se digitar
             */
            JOptionPane.showMessageDialog(rootPane, "Data in.","Erro!!!", 0);
        }
    }

Classe

package Validar;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 *
 * @author Administrador
 */
public class DATA2 {

 

 
	public boolean isThisDateValid(String dateToValidate, String dateFromat){
 
		if(dateToValidate == null){
			return false;
		}
 
		SimpleDateFormat sdf = new SimpleDateFormat(dateFromat);
		sdf.setLenient(false);
 
		try {
 
			//if not valid, it will throw ParseException
			Date date = sdf.parse(dateToValidate);
			System.out.println(date);
 
		} catch (ParseException e) {
			return false;
		}
 
		return true;
	}
}

4 Respostas

Rodrigo_Sasaki

só uma observação no seu formato.

mm - minutos
MM - mês

Ziguifrid

Consegui.

O problema era no formato da data.

Tem que ficar assim "DD/mm/yyyy" e eu deixava assim "dd/mm/yyyy"

digaoneves se eu deixar dd/MM/yyyy o mês é validado com qualquer valor. O por quê? Eu não sei.

Agora a classe que eu fiz para validar data está funcionando.

Principal

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        try {
            
            DateFormat formatter = new SimpleDateFormat("DD/mm/yyyy");//formatar dia
            data = (Date) formatter.parse(JFDATA.getValue().toString());
            //data mostra este formato data Wed Jun 06 00:00:00 BRT 2012
            String dataaux1=formatter.format(data);//transforma date em String
            
            //Validar datas
            DATA validar = new DATA();
            validar.validata(dataaux1);
                    
        } catch (Exception e) {
            JOptionPane.showMessageDialog(rootPane, e.getMessage(),"Erro!!!", 0);
        }
    }

Classe

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Validar;

import java.awt.HeadlessException;
import java.text.ParseException;
import javax.swing.JOptionPane;

/**
 *
 * @author Michel Adriano Medeiros
 * Para esta classe de validação de data funcionar no formulário de captura,
 * o formato deve ser assim:
            DateFormat formatter = new SimpleDateFormat("DD/mm/yyyy");//formatar dia tem que ser exatamente neste formato "DD/mm/yyyy"
            data = (Date) formatter.parse(JFDATA.getValue().toString());
            //data mostra este formato data Wed Jun 06 00:00:00 BRT 2012
            String dataaux1=formatter.format(data);//transforma date em String
 * 
 */
public class DATA {

    public boolean validata (String data) throws ParseException{
        try {
            
            String dia, mes, ano;
            int diaint, mesint, anoint;
            int verificarano;//variável usada para ver se o ano termina em 00
            String verano;//variável usada para capturar os dois dígitos finais do ano
            int bissexto=0; //igual à zero = bissexto, diferente disto ano normal
                       
            dia = data.substring(0,2);//captura apenas o dia
            mes = data.substring(3,5);//captura apenas o mês
            ano = data.substring(6, 10);//captura apenas o ano
            
            diaint = Integer.parseInt(dia);//transforma o valor de String para int
            mesint = Integer.parseInt(mes);
            anoint = Integer.parseInt(ano);
       
            //Verificar se ano é bissexto
            int valorano = anoint%4;//captura o valor do resto
            
            if(valorano==0){//Anos em que o resto será zero
                verano = data.substring(8,10);//captura os dois dígitos finais do ano
                verificarano = Integer.parseInt(verano);//transforma verano em int
                bissexto=0;//aciona ano bissexto, senão tiver esta linha os anos que são bissexto mas não termina em 00, serão anos normais
                if(verificarano==0){
                    //***validação de datas para anos com fim 00
                    valorano = anoint%400;
                    if(valorano==0){
                        bissexto=0;//ano bissexto
                    }
                    else{
                        bissexto=1;//ano normal
                    }
                    //***fim da validação de datas para anos com fim 00        
                }//fim do verificarano==0
            }//fim do valorano==0
            else{//Anos em que o resto não será zero
                bissexto=1;//ano normal
            }
            
            //verificar validade do mês
            if(mesint>0 && mesint<=12){
            //verificar se o mês é fevereiro
            if(mesint==02){
                if(diaint>=30 && bissexto==0){//ano bissexto
                    JOptionPane.showMessageDialog(null,"Dia inválido.","Erro!!!",0);
                }
                else if(diaint>=29 && bissexto==1){//ano normal
                    JOptionPane.showMessageDialog(null,"Dia inválido.","Erro!!!",0);
                }                
                else{
                    return true;
                }
            }
            else if(mesint==1 || mesint==3 || mesint==5 || mesint==7 || mesint==8 || 
                    mesint==10 || mesint==12){
                if(diaint>31){
                    JOptionPane.showMessageDialog(null,"Dia inválido.","Erro!!!",0);
                }
                else{
                    return true;
                }
            }
            else if(mesint==4 || mesint==6 || mesint==9 || mesint==11){
                if(diaint>30){
                    JOptionPane.showMessageDialog(null,"Dia inválido.","Erro!!!",0);
                }
                else{
                    return true;
                }
            }
            
            }//fim do mesint>12 || mesint <=0
            else{
                JOptionPane.showMessageDialog(null,"Mês inválido.","Erro!!!",0);
            }
          
  
        } catch (NumberFormatException | HeadlessException e) {
            JOptionPane.showMessageDialog(null, e.getMessage(),"Erro!", 0);            
        }
        return false;
        
    }
    
}
Rodrigo_Sasaki

bom, eu ainda acho que isso aí vai dar problema… por que DD é o dia do ano… dd é o dia do mes.

Danilo_Carvalho

Bom dia!

Tente colocar o método simpleDateFormat.setLenient(false); dentro do try catch, vai funcionar quando você digitar 32/01/2012,
mas se você está em um projeto swing aconselho a usar o componente nachocalendar.

Até mais

Criado 19 de setembro de 2012
Ultima resposta 19 de set. de 2012
Respostas 4
Participantes 3