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
Como fazer validação de data?
7 Respostas
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.
Teria como me dar um exemplo irmão? De como funciona?
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.
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.
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
Estranho
, eu não tive esse problema quando utilizei o JDateChooser…
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