Como fazer validação de data?

7 respostas
P

Estou usando o campo de formatação para data no netbeans em Java, dd/MM/yyyy, porém se o usuário digitar 40/40/2000, o sistema explode erros! Porque é um dia e um mês que não existe! Alguém sabe como posso validar? Para que não de erro! Ou não permita que o usuário digite dia maior que 31 e mês maior que 12? Desde já muito obrigado

7 Respostas

Jonathan_Medeiros

Eu trabalhava com o componente JDateChooser, que é muito mais prático e já tem essas validações de datas prontas, muito melhor que ficar fazendo tudo na mão.

P

Teria como me dar um exemplo irmão? De como funciona?

Jonathan_Medeiros

Basta fazer o download do componente, adicioná-lo na paleta de componentes dentro do Netbeans, depois é igual ao demais componentes, arrastar e soltar, não tem segredo.

Como não utilizo Netbeans faz um bom tempo não vou saber te dizer um passo a passo, mas se tu der uma pesquisa rápida aí você consegue diversos tutoriais de como proceder em caso de dificuldade.

Jothar_Aleksander

Eu acolheria a sugestão do @Jonathan_Medeiros. Contudo, um exemplo com String:

public enum DiasPorMes{
	JAN(1, 31),
	MAR(3, 31),
	ABR(4, 30),
	MAI(5, 31),
	JUN(6, 30),
	JUL(7, 31),
	AGO(8, 31),
	SET(9, 30),
	OUT(10, 31),
	NOV(11, 30),
	DEZ(12, 31);
	
	private int ordemMes;
	private int diasMes;
	
	private DiasPorMes(int ordemMes, int diasMes){
		this.ordemMes = ordemMes;
		this.diasMes = diasMes;
	}
	
	public int getOrdemMes(){
		return ordemMes;
	}
	
	public int getDiasMes(){
		return diasMes;
	}
} 

public class VerificarData {
	
	private boolean validar(String dataInformada){
		
		final short DIA = 0;
		final short MES = 1;
		final short ANO = 2;
		final short FEVEREIRO = 2;
		boolean resultado = false;
		
		String[] datasValores = dataInformada.split("\\/");
		int[] datasInteiras = new int[3];
		
		for(int itemData = 0; itemData < datasValores.length; itemData++){
			datasInteiras[itemData] = Integer.parseInt(datasValores[itemData]);
		}
		
		if(datasInteiras[ANO] > 1900 
			&& datasInteiras[MES] > 0 && datasInteiras[MES] <= 12
			&& datasInteiras[DIA] > 0 && datasInteiras[DIA] <= 31){
				
			for(DiasPorMes itemData : DiasPorMes.values()){
				if(datasInteiras[MES] == itemData.getOrdemMes() 
					&& datasInteiras[DIA] <= itemData.getDiasMes()){
					resultado = true;
					break;
				}else
					resultado = false;
			}
			
			if((datasInteiras[ANO] % 4 == 0 
				&& datasInteiras[ANO] % 100 != 0 
				&& datasInteiras[ANO] % 400 == 0) 
				|| (datasInteiras[ANO] % 4 == 0 
				&& datasInteiras[ANO] % 100 == 0 
				&& datasInteiras[ANO] % 400 == 0)){
					
				if(datasInteiras[MES] == FEVEREIRO){
					if(datasInteiras[DIA] <= 29)
						resultado = true;
					else
						resultado = false;
				}else{
					if(datasInteiras[MES] == FEVEREIRO){
						if(datasInteiras[DIA] <= 28)
							resultado = true;
						else
							resultado = false;
					}
				}
			}
		}
		return resultado;
	}
		
	public static void main(String[] args){
		VerificarData verificarData = new VerificarData();
		System.out.println("Data válida? " + verificarData.validar("29/02/2001"));
	}
}

Viste como é trabalhoso? Além disso, eu nem coloquei um teste se o usuário digitar letras, como por exemplo, 5a/21/201h.

Exemplo de instalação do JCalendar no NetBeans: Parte 1 - Instalação

Obs.: veja a partir de 03:08 minutos.

Exemplo de uso: Parte 2 - Usando o JCalendar

Obs.: veja a partir de 00:36 minuto.

P

Muito bom! Vou tentar desse jeito! Mais tem um porém na escolha que o @Jonathan_Medeiros me passou o JDataChooser ele insere normalmente no banco de dados mas… Se eu tentar inserir um registro do ano de 1999 para baixo ele sub entende que esta em 2000 então ficaria 2099! E se eu deixar na formatação de padrao dd/MM/yyyy esse explode erro pois no próprio Chosser ele apenas captura dd/MM/yy

Jonathan_Medeiros

Estranho :thinking:, eu não tive esse problema quando utilizei o JDateChooser…

P

Não sei se é porque estou usando um Date Chooser Combo que permite na escolha dd/MM/yy depois eu transformo ele em um LocalDate e passo como parâmetro para Salvar no Banco de Dados… @Jonathan_Medeiros

Criado 28 de agosto de 2019
Ultima resposta 28 de ago. de 2019
Respostas 7
Participantes 3