Ajuda com Datas

8 respostas
R

Bom dia Galera do GUJ …

Estou com um problemão! Criei um Bean e nesse Bean coloquei os Campos Data e Hora como sendo String, pois esse Bean é “alimentado” por um método da minha tela Principal que pega o conteúdo do tfData e tfHora. Preciso pegar esse valores passados ao Bean e convertê-los em um tipo java.sql.Date (dentro de outra classe - Control - responsável pelos comandos SQL), mas está dando o seguinte erro:

java.lang.IllegalArgumentException: Cannot format given Object as a Date

Estou utilizando o SimpleDateFormate para Formatar e “Parsear” a String capturada pelo Bean (dd/MM/yyyy) no formato do banco de Dados (yyyy-MM-dd). Estou utilizando o PostgreSQL 9.1.

A data e hora são “jogadas” dentros dos respectivos textFields através de um Componente Swing que Adicionei ao NetBeans 7.1 (o jCalendarButton e jTimeButton que abrem um Popup com o Calendário e as Horas para serem usados).

Segue abaxo os Códigos do Bean …

public class AgendaBean {
    private String data;
    private String hora;

    /**
     * @return the data
     */
    public String getData() {
        return data;
    }

    /**
     * @param data the data to set
     */
    public void setData(String data) {
        this.data = data;
    }

    /**
     * @return the hora
     */
    public String getHora() {
        return hora;
    }

    /**
     * @param hora the hora to set
     */
    public void setHora(String hora) {
        this.hora = hora;
    }

do Control …

public class AgendaControl {
      
   SimpleDateFormat dataf = new SimpleDateFormat("dd/MM/yyyy");
   SimpleDateFormat datag = new SimpleDateFormat("yyyy-MM-dd");
   SimpleDateFormat horaf = new SimpleDateFormat("HH:mm");
  
   java.sql.Date d = null;
   java.sql.Date h = null;

    PreparedStatement pstm;
    ResultSet rs;

    String gravaRegistro = "insert into agendas(data, hora) values(?,?)";

    public void gravarRegistro(AgendaBean ab) {
        ConexaoBD con = new ConexaoBD();
        try {
            pstm = con.conecta().prepareStatement(gravaRegistro);
            pstm.setDate(1, d = new java.sql.Date(datag.parse(ab.getData()).getTime()));
            pstm.setDate(2, h = new java.sql.Date(horaf.parse(ab.getHora()).getTime()));

            pstm.executeUpdate();
            JOptionPane.showMessageDialog(null, "Registro Gravado com Sucesso!");
            con.desonecta();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Não Foi Possível Gravar o Registro!");
            e.printStackTrace();
        }

E da Tela Principal …

public static DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
    public static DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.SHORT);

    public void setDate(String dateString) {
        Date date = null;
        try {
            if ((dateString != null) && (dateString.length() > 0)) {
                date = dateFormat.parse(dateString);
            }
        } catch (Exception e) {
            date = null;
        }
        this.setDate(date);
    }

    public void setDate(Date date) {
        String dateString = "";
        if (date != null) {
            dateString = dateFormat.format(date);
        }
        tfData.setText(dateString);
        jCalendarButton1.setTargetDate(date);
    }

    public void setTime(String timeString) {
        Date time = null;
        try {
            if ((timeString != null) && (timeString.length() > 0)) {
                time = timeFormat.parse(timeString);
            }
        } catch (Exception e) {
            time = null;
        }
        this.setTime(time);
    }

    public void setTime(Date time) {
        String timeString = "";
        if (time != null) {
            timeString = timeFormat.format(time);
        }
        tfHora.setText(timeString);
        jTimeButton1.setTargetDate(time);
    }

    private void gravaRegistro() {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        AgendaControl c = new AgendaControl();
        AgendaBean agenda = new AgendaBean();
        agenda.setData(df.format(tfData.getText().trim()));
        agenda.setHora(tfHora.getText().trim());
        c.gravarRegistro(agenda);
        try {
            con.executeSQL("select * from agendas order by data");
            con.rs.next();
            mostraDados();

        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro ao Tentar Gravar os Registros!");
        }
    }

Alguém tem alguma Solução para o meu Problemão??? Já pensei em mudar o tipo de dado no Bean para Date e já passar para o Bean o Date formatado (yyyy-MM-dd) no formato java.sql.Date. Pode ser uma Solução! Mas se alguém tiver alguma forma de eu não ter que mexer nisso e manter meu Bean com String eu Agradeço.

8 Respostas

R

primeiro a pergunta óbvia hehehe

o que é retornado nas chamadas:

ab.getData();
ab.getHora();

da sua AgendaControl?

R

ab.getData retorna a data no formato String “dd/MM/yyyy”
e
ab.getHora retorna a hora no formato String “HH:mm”

R

sim… mas eu quero saber o valor real do que está sendo retornado… você chegou a debugar (ou imprimir) e ver o que ele retorna?

R

não há retorno, ocorro um erro informando que não pode converter um objeto em Data.

java.lang.IllegalArgumentException: Cannot format given Object as a Date
R

rolipam:
não há retorno, ocorro um erro informando que não pode converter um objeto em Data.

java.lang.IllegalArgumentException: Cannot format given Object as a Date

sim… na sua conversão algo está acontecendo de errado… mas eu digo antes disso

qual o valor da sua String data dentro do seu objeto AgendaBean na hora de tentar fazer a conversão?
mande imprimir no console, ou coloque um breakpoint para inspecioná-lo

R

Vou ter que ver isso mais tarde. No momento estou no trabalho e esse projeto está no computador em minha casa. Vlw pela dica. Até mais tarde.

R

é… eu acredito que possa estar vindo algum valor incompatível… não sei dizer o que… porque fiz o seguinte teste e a conversão funcionou sem problemas:

public static void main(String[] args){
	SimpleDateFormat dataf = new SimpleDateFormat("dd/MM/yyyy");  
	SimpleDateFormat datag = new SimpleDateFormat("yyyy-MM-dd");
	String datafParam = "13/04/2012";
	String datagParam = "2012-04-13";
	try{
		System.out.println("1 - "+new java.sql.Date(dataf.parse(datafParam).getTime()));
		System.out.println("2 - "+new java.sql.Date(datag.parse(datagParam).getTime()));
	} catch (ParseException e){
		System.out.println("Não consegui parsear");
		e.printStackTrace();
	}
}

e no meu console foi impresso isso:


1 - 2012-04-13
2 - 2012-04-13

R

O meu problema pode estar no fato d’eu estar tentando “parsear” um objeto vindo de outra classe (o Bean) e não uma String. Por isso a mensagem de não conseguir converter um objeto em Date!!! Mas posso estar enganado sobre isso também …

Tentei passar para o Bean a String Data já formatada (“yyyy-MM-dd”) pelo método gravarRegistro() da Tela Proncipal e depois tentei “parsear” o objeto (ab.getData) pelo meu Control e Deu o mesmo erro (testei isso há pouco tempo aqui no trabalho, porém no computador em que digito os códigos não não posso instalar o banco de dados, então utilizo outra máquina que não está na rede do meu trabalho para testar a aplicação.

Criado 13 de abril de 2012
Ultima resposta 13 de abr. de 2012
Respostas 8
Participantes 2