Datas: os problemas continuam!

Bom dia colegas !

Tenho postado várias dúvidas sobre como tratar datas na camada de apresentação e na de persistência…

Com a ajuda de vocês e principalmente do fabiocsi tenho conseguido resolver vários problemas.

Bom… desta vez a minha dúvida é a seguinte:
Tentei criar uma classe com dois métodos, um para receber um Date e retornar um string, e outro para receber um String e retornar um Date.

Basicamente, a intenção era:
Com o primeiro método: utilizar na tela para receber um Date do banco, converter em String num formato escolhido para poder mostrar num JTextField.
E com o segundo: utilizar na camada de persistência para receber um String, converter em Date num formato escolhido para poder gravar no banco.

Segue meu código e o erro que esta dando na compilação:

package com.atm.util;

import java.sql.Date;
import java.text.SimpleDateFormat;

/**
 *
 * @author r100320
 */
public class ConverterData {
    
    public static String dateToString(Date data, String formato){
        SimpleDateFormat sdf = new SimpleDateFormat(formato);
        return sdf.format(data);
    }
    
   public static Date stringToDate(String data, String formato) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat(formato);
        try {
            return (Date) sdf.parse(data);
        } catch (ParseException ex) {
            throw new Exception("A Data é inválida ou nao encontra-se no formato DD/MM/YYYY");
        }
    }        
}

E agora o erro que recebo na compilação:

init:
deps-jar:
Compiling 1 source file to D:\ProjetoATM\atm\build\classes
D:\ProjetoATM\atm\src\com\atm\util\ConverterData.java:28: incompatible types
found   : java.util.Date
required: java.sql.Date
        return sdf.parse(data);
1 error
FALHA NA EXECUÇÃO (tempo total: 4 segundos)

O erro é na linha:

        return sdf.parse(data);

Se eu faço um cast para (Date) funciona… mas eu não entendi porque !

        return (Date) sdf.parse(data);

Se alguém puder me ajudar, fico muitíssimo grato !

[]s

Você tá usando o import errado.

Troca a linha

import java.sql.Date;

por esta

import java.util.Date;

[]'s
Eduardo

A hierarquia de classes de Date é a seguinte:
java.lang.Object
extended by java.util.Date
extended by java.sql.Date

O método parse de SimpleDateFormat retorna um java.util.Date, logo a conflito de tipos pois você pode falar que todo java.sql.Date é um java.util.Date e não o contrário. Quando você faz o casting você está assumindo o risco de quanto a conversão de tipos em tempo de compilação, mas dará erro em tempo de execução (ClassCastException). O mais prudente seria você colocar a seguinte linha:

return new Date(sdf.parse(data).getTime());

onde você estaria criando um java.sql.Date a partir de um java.util.Date

resumindo…

pega o atributo Date das suas classes e troca por Timestamp… qdo vc for pegar ele do banco vc usa rs.getTimestamp(“campo”);

o Timestamp pode ser passado para metodos que usem Date como argumento… timestamp extende Date

Fabio

A alugação continua :smiley:

Então… ainda estou com problemas para pegar o valor digitado no JTextField e transformar em Date ou Timestamp para usar no prepareStatement para atualizar no banco…

Você pode me ajudar ?

A classe que criei para tentar fazer isso é essa:

public class ConverterData {
    
    public static String dateToString(Timestamp data, String formato){
        SimpleDateFormat sdf = new SimpleDateFormat(formato);
        return sdf.format(data);
    }
    
    public static Timestamp stringToDate(String data, String formato) {
        SimpleDateFormat sdf = new SimpleDateFormat(formato);
        try {
            return (Timestamp) sdf.parse(data);
        } catch (ParseException ex) {
            ex.printStackTrace();
            return null;
        }
    }
}

Valeu !

[]s

vc tem uma data 16/06/2006 no seu txtField… seu objeto Cliente tem um atributo dataNascimento, do tipo Timestamp…

cliente.setDataNascimento( ConverterData.stringToDate( txtData.getText(), "dd/MM/yyyy" ) );

ai na hora de inserir no banco vc faz:

preparedStatement.setTimestamp( 1, cliente.getDataNascimento() );

nao funciona?

otra coisa…

esse cast ai de Date pra Timestamp acho que nao funfa… lembre-se que nem todo Date é um Timestamp… entao substitua a linha

return (Timestamp) sdf.parse(data);

por

return new Timestamp( sdf.parse(data).getTime() );

segue uma classe para você usar como exemplo.

Fabio

Acho que agora você matou a charada !

Bom, pelo menos esta funcionando, ou seja, pego uma data do banco no formato “yyyy-DD-mm” e mostro num JTextField da tela como “dd/MM/yyyy” e pego um JTextField da tela, com “dd/MM/yyyy” e gravo no banco no formato “yyyy-DD-mm”.

Tambem esta funcionando para um campo com data e hora, ou seja, no banco esta “yyyy-DD-MM hh:mm:ss” e na tela quero que apareça “dd/MM/yyyy hh:mm:ss”.

Segue o código da classe que faz as conversões e a chamada onde eu a utilizo.

public class ConverterData {
    
    public static String dateToString(Timestamp data, String formato){
        SimpleDateFormat sdf = new SimpleDateFormat(formato);
        return sdf.format(data);
    }
    
    public static Timestamp stringToDate(String data, String formato) {
        JOptionPane.showMessageDialog(null, data + "-"+formato);
        SimpleDateFormat sdf = new SimpleDateFormat(formato);
        try {
            return new Timestamp(sdf.parse(data).getTime());
        } catch (ParseException ex) {
            ex.printStackTrace();
            return null;
        }
    }    
}
        clienteTemp.setDataNascimento(ConverterData.stringToDate(txtDataNascimento.getText(),"dd/MM/yyyy"));
        clienteTemp.setDataStatus(ConverterData.stringToDate(txtDataStatus.getText(),"dd/MM/yyyy hh:mm:ss"));                    

Você acha que desse jeito ficou tudo certo ?

Um abraço e muitíssimo obrigado !

Alguém sabe me dizer como eu entrego uma estrelinha para o nosso amigo ?

me paga uma coca 600ml depois e ta tudo certo :smiley: