Boa noite Colegas !
O usuário digita um dado num JTextBox, como verificar que foi digitada uma data válida ?
Entender por data valida: DD/MM/YY ou DD/MM/YYYY.
Resumindo: tendo uma string, como verificar que é uma data válida ?
Obrigado a todos.
[]s
Boa noite Colegas !
O usuário digita um dado num JTextBox, como verificar que foi digitada uma data válida ?
Entender por data valida: DD/MM/YY ou DD/MM/YYYY.
Resumindo: tendo uma string, como verificar que é uma data válida ?
Obrigado a todos.
[]s
Eu uso o SimpleDateFormat do pacote java.text
Não testei o código, mas acho que isso aqui vai funcionar legal:
public boolean ehDataValida(String valor) {
boolean valida = true;
try {
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = (Date)formatter.parse(valor);
} catch(ParseException e) {
valida = false;
}
return valida;
}
Boa noite colegas !
AndreAlves:
Antes de mais nada obrigado pela dica, valeu !
Mas eu implementei o método e não funcionou da maneira que eu esperada.
Estou recebendo um ParseException na linha
Date date = (Date) formatter.parse(data);
A string que estou passando é “10/05/2007”.
Sabe me dizer o que pode estar errado ?
Esse é o meu código:
public boolean verify(JComponent cp){
boolean result = true;
JTextField dataText = (JTextField) cp;
boolean badFormat = false;
10/05/2007
if (dataText.getText() != null && dataText.getText().length() > 0) {
if (dataText.length() == 8) {
if ( !(dataText.substring(2, 2).equals("/") || data.substring(5, 5).equals("/")) ) {
dataText = dataText.substring(0, 1) + "/" + dataText.substring(2, 3) + "/" + dataText.substring(4,8);
} else {
badFormat = true;
}
} else if (data.length() == 10) {
if (!(data.substring(2, 2).equals("/") && data.substring(5, 5).equals("/"))) {
badFormat = true;
}
} else {
badFormat = true;
}
}
if ( badFormat ) {
JOptionPane.showMessageDialog(null,"Digite a data no formato DD/MM/AAAA", "Erro",
JOptionPane.ERROR_MESSAGE);
result = false;
} else if ( data.length() > 0 ) {
try {
DateFormat formatter = new SimpleDateFormat("##/##/####");
Date date = (Date) formatter.parse(dataText);
} catch (ParseException e){
System.out.println(e.getMessage());
System.out.println(dataText);
result = false;
}
if (! result) {
JOptionPane.showMessageDialog(null, "Data inválida.", "Erro",
JOptionPane.ERROR_MESSAGE);
result = false;
}
return result;
}
}
No print que estou dando no Exceptio sai:
Unparseable date: “10/05/2007”
10/05/2007
Então acho que estou passando o parametro correto para o parse…
Obrigado a todos.
[]s
public static boolean isParseableDate( String data ) {
SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
formatador.setLenient( false );
try {
formatador.parse( data );
return true;
} catch ( Exception e ) {
return false;
}
}
Boa tarde colegas !
fabiocsi:
Agora rolou 100% ! Valeu !
Obrigado a todos os outros que ajudaram também !
Agora Fábio, se puder me explicar umas coisinhas…
O método verify recebe um Component como argumento.
Esse componente é o JTextField que eu setei como
data.setInputVerifier();new DataInputVerifier()
certo ?
Existe algum método equivalente ao getText() no Component ?
Porque eu tive que colocar essas linhas pra conseguir pegar o valor:
JTextField textFieldTemp = (JTextField) cp;
String data = textFieldTemp.getText();
Outra coisa… não entendi em que parte do método eu estou devolvendo o valor formatado para o JTextField da tela…
Bom, na verdade sei que isso esta sendo feito nas linhas:
data = data.substring(0, 2) + "/" + data.substring(2, 4) + "/" + data.substring(4);
textFieldTemp.setText(data);
Mas não entendi como…
Este é o método verify que criei baseado na dica do outro tópico que você passou antes:
public boolean verify(JComponent cp){
boolean result = true;
JTextField textFieldTemp = (JTextField) cp;
String data = textFieldTemp.getText();
boolean badFormat = false;
boolean aceitaDataPosteriorAtual = false;
if (data != null && data.length() > 0) {
if (data.length() == 8) {
if ( !(data.substring(2, 3).equals("/") || data.substring(5, 6).equals("/")) ) {
data = data.substring(0, 2) + "/" + data.substring(2, 4) + "/" + data.substring(4);
textFieldTemp.setText(data);
} else {
badFormat = true;
}
} else if (data.length() == 10) {
if (!(data.substring(2, 3).equals("/") && data.substring(5, 6).equals("/"))) {
badFormat = true;
}
} else {
badFormat = true;
}
}
if ( badFormat ) {
JOptionPane.showMessageDialog(null,"Digite a data no formato DD/MM/AAAA", "Erro",
JOptionPane.ERROR_MESSAGE);
result = false;
} else if ( data.length() > 0 ) {
SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
formatador.setLenient( false );
try {
formatador.parse( data );
result = true;
} catch ( Exception e ) {
result = false;
}
if (! result) {
JOptionPane.showMessageDialog(null, "Data inválida.", "Erro",
JOptionPane.ERROR_MESSAGE);
} else if (!aceitaDataPosteriorAtual) {
//try {
//Timestamp dataDigitada = Util.formataStringToDate(data);
//Timestamp dataDigitada = data;
//Timestamp dataAtual = Util.dataAtual();
//if (dataDigitada.after(dataAtual)) {
// JOptionPane.showMessageDialog(null,
// "Data não pode ser superior à data atual.", "Erro",
// JOptionPane.ERROR_MESSAGE);
// result = false;
result = true;
// }
//} catch (Exception exc) {
// exc.printStackTrace();
//}
}
}
return result;
}
A parte do "aceitaDataPosteriorAtual
esta comentada porque esta dando erro… acho que não tenho o pacote Util
Um abraço e muito obrigado novamente pela ajuda !
é cara, realmente qdo criei isso ai acabei amarrando com a minha classe Util, entao ficou um poco acoplada… sorry mas vc pode criar um InputVerifier decente, que aceite não so Datas, mas tb CPF, telefones etc…
ai vc poderia fazer algo do tipo:
textField.setInputVerifier( );new SeuInputVerifier( SeuInputVerifier.CPF )
textField.setInputVerifier( );new SeuInputVerifier( SeuInputVerifier.DATA )
Boa noite colegas !
Fabio,
Você me aconselha a criar uma única classe que faça diversos tipo de validações ?
Dessa maneira a validação seria de CPF e DATA, por exemplo, seriam separadas por IF´s ??
Valeu !
Abraços