Problema com Datas

8 respostas
Zeed01

Boa tarde colegas !

Imaginem a seguinte classe Cliente:

public class Cliente implements Serializable {
private Date dataNascimento;

 public Date getDataNascimento() {
        return this.dataNascimento;
    }

    public void setDataNascimento(Date dataNascimento) {
        this.dataNascimento = dataNascimento;
    }
}

E uma GUI que utiliza a classe cliente.
Como seria a chamada do método set da data de nascimento ?

Eu tentei assim:

private void btGravarActionPerformed(java.awt.event.ActionEvent evt) {                                         
        Cliente clienteTemp = new Cliente();
                
        clienteTemp.setDataNascimento(new Date(txtDataNascimento.getText()));

Esta dando erro na linha onde utilizo o setDataNascimento.
txtDataNascimento é um JTextField.

Outro problema é que no meu banco (MySql) esta gravando YYYY-MM-DD, como posso fazer pra gravar DD/MM/YYYY ?

Obrigado a todos.

Um abraço.

8 Respostas

diego2005

Use a classe DateFormat:

DateFormat df = DateFormat.getDateInstance(); try { Date dt = df.parse("1/1/2007"); } catch(ParseException e) {}

T+

fabim

hohoho mas seria estranho se o construtor de Date aceitasse uma String, vc nao acha? em que formato estaria essa String? e datas como 32/50/2006, seriam aceitas?

private void btGravarActionPerformed(java.awt.event.ActionEvent evt) {                                         
         Cliente clienteTemp = new Cliente();
                 
         try {
                   clienteTemp.setDataNascimento(formatarData(txtDataNascimento.getText()));

         } catch ( Exception e ) {

                   JOptionPane.showMessageDialog( null, e.getMessage() );

         }

}
public static Date formatarData( String strData ) throws Exception {

SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
formatador.setLenient( false );

try {
    
	formatador.parse( data );
	return true;
      
} catch ( Exception e ) {
    
       throw new Exception("A Data é inválida ou nao encontra-se no formato DD/MM/YYYY");

}

}
Zeed01

Boa tarde colegas !

Fabio:

Na verdade eu ja tinha tentado utilizar uma antiga explicação sua sobre validação de datas para tentar formatar o campo utilizando SimpleDateFormat.

Meu código esta assim:

SimpleDateFormat formataData = new SimpleDateFormat("yyyy-MM-dd");
            formataData.setLenient(false);
            JOptionPane.showMessageDialog(null,"Data OBJ cliente: " + cliente.getDataNascimento());
            JOptionPane.showMessageDialog(null,"Data OBJ cliente como string: " + String.valueOf(cliente.getDataNascimento()));
            
            try {
                JOptionPane.showMessageDialog(null,"Data OBJ cliente após formatação: " + formataData.parse(String.valueOf(cliente.getDataNascimento())));
                txtDataNascimento.setText(String.valueOf(formataData.parse(String.valueOf(cliente.getDataNascimento()))));
            } catch (Exception ex) {
                JOptionPane.showMessageDialog( null, ex.getMessage() );
            }

No entanto a linha

JOptionPane.showMessageDialog(null,"Data OBJ cliente após formatação: " + formataData.parse(String.valueOf(cliente.getDataNascimento())));

Esta produzindo a saída:

Fri May 22 00:00:00 GMT-03:00 1970

Sendo que a data armazenada no banco é 1970-05-22

Voce ou alguem pode me ajudar ?

Obrigado.

[]s

fabim

Nao entendi.

Você está querendo customizar a exibição dessa data, no formato yyyy-MM-dd?

Se for isso, faça um metodo, que ao inves de receber uma string e devolver uma data, que recebe uma data e devolve no formato ( definido por vc )…

não é porque uma data esta no banco no formato yyyy-MM-dd, que a exibição String dela com String.valueOf( date ) vai ser a mesma coisa… vc tem q customizar isso…

por isso sempre tenha metodos na sua classe Utils, como:

public static String timestampToString( Timestamp data, String formato ) { // pega um timestamp e devolve uma String no formato passado } public static String timestampToString( Timestamp data ) { // overload return timestampToString( data, "dd/MM/yyyy" ); } public static Timestamp stringToTimestamp( String data ) throws Exception{ // devolve uma data com base em uma String }
eu uso java.sql.Timestamp inves de Date.

por ai vai…

fabim

exemplo:

txtData.setText( new SimpleDateFormater("dd/MM/yyyy").format( seuDate ) );
Zeed01

Fabio

O que eu quero é mostrar a data no formato “dd/MM/yyyy” sendo que no banco ela esta “yyyy-MM-dd”.

Mas seguindo a sua outra dica eu criei um método:

private static Date formatarData( String strData ) throws Exception {
        SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
        formatador.setLenient( false );

        try {
            return formatador.parse( strData );
        } catch ( Exception e ) {
            throw new Exception("A Data é inválida ou nao encontra-se no formato DD/MM/YYYY");
        }
     }

E estava tentando usar assim:

try {
                //txtDataNascimento.setText(new SimpleDateFormat("dd/MM/yyyy").format(cliente.getDataNascimento()));
                txtDataNascimento.setText(String.valueOf(formatarData(String.valueOf(cliente.getDataNascimento()))));
            } catch (Exception ex) {
                JOptionPane.showMessageDialog( null, ex.getMessage() );
            }

No entanto estou recebendo a exception ““A Data é inválida ou nao encontra-se no formato DD/MM/YYYY”)”.

Você sabe o que esta errado ?

Obrigado.

[]s

fabim

Zeed,

vc esta tornando complicado algo que é simples.

entenda: ‘parsear’ é quando vc tem uma String, e precisa fazer um parse pra Date… isso pode disparar exceção, pois datas invalidas nao serao aceitas.

se o seu objeto cliente, ja tem um Atributo DATE, entao vc simplesmente faz isso:

txtDataNascimento.setText(new SimpleDateFormat("dd/MM/yyyy").format(cliente.getDataNascimento()));

ou senão:

txtDataNascimento.setText(String.valueOf(formatarData(String.valueOf(cliente.getDataNascimento()))));

sem esse monte de String.valueOf que vc ta usando ai…

se vc usar esse String.valueOf, ele vai te retornar algo como “Fri May 22 00:00:00 GMT-03:00 1970”, e OBVIAMENTE, se vc passar isso pro metodo FORMAT que vc criou vai disparar exception dizendo que a data e invalida… esquece esses “String.valueOf”

Zeed01

Então Fábio…

Meu problema agora é pegar o que esta na tela, no JTextField, e transformar em Date, para jogar num objeto Cliente e depois persistir no banco através de um preparedStatement…

Tem jeito ?

Valeu pela força !

[]s

Criado 7 de agosto de 2007
Ultima resposta 9 de ago. de 2007
Respostas 8
Participantes 3