Trabalhar com Data e hora no java

16 respostas
java
T

Olá pessoal,

Estou com muitas dúvidas. Estou com um projeto básico e preciso mandar para o BD hora e data. Porém, do jeito que eu fiz está dando erro.

Estou usando construtor. Eu pego os dados da caixa de texto do Jframe e converto para time e date. Até então não apresenta nenhum erro, mas quando eu clico no botão enviar, ele da erro de java, nem de SQL ele da. O insert, os métodos e a conexão estão certas, porém, nessa linha do construtor, que está no botão enviar dá erro.

Já testei e nesta linha da erro no construtor. Já pesquisei, mas não consegui. Não sou muito bom para trabalhar com hora e data rs. Poderiam me ajudar por favor.

Dados dad = new Dados(
	Time.valueOf(TxtEntrada.getText()), 
	Time.valueOf(TxtSaida.getText()), 
	Time.valueOf(TxtAdicional.getText()),
	null,
	" ",
	" ",
	" ");

if (new VUsuario().inserirDados(dad)) {
	System.out.println("Inserido dados");
} else {
	JOptionPane.showMessageDialog(null, "Problemas na função inserir");
}

16 Respostas

L

Qual o erro que dá no java?

T

private void BntEnviarActionPerformed(java.awt.event.ActionEvent evt) {

Dados dad = new Dados (Time.valueOf(TxtEntrada.getText()),
            Time.valueOf(TxtSaida.getText()),
            Time.valueOf(TxtAdicional.getText()), 
            (java.sql.Date) new Date(TxtData.getText()),
            null,
            null,
            null);

Coloquei dessa forma como está ai em cima e da esse :

A classe dados e a classe onde fica os comandos sql está do mesmo tipo, até porque não da nenhum erro, mas na hora de enviar ele da um erro no construtor. até mandei o date ai conforme está ai em cima mas não foi.

Exception in thread AWT-EventQueue-0 java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date

at Janelas.FrmDados.BntEnviarActionPerformed(FrmDados.java:194)

at Janelas.FrmDados.access$100(FrmDados.java:23)

at Janelas.FrmDados$2.actionPerformed(FrmDados.java:69)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)

at java.awt.Component.processMouseEvent(Component.java:6533)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)

at java.awt.Component.processEvent(Component.java:6298)

at java.awt.Container.processEvent(Container.java:2236)

at java.awt.Component.dispatchEventImpl(Component.java:4889)

at java.awt.Container.dispatchEventImpl(Container.java:2294)

at java.awt.Component.dispatchEvent(Component.java:4711)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)

at java.awt.Container.dispatchEventImpl(Container.java:2280)

at java.awt.Window.dispatchEventImpl(Window.java:2746)

at java.awt.Component.dispatchEvent(Component.java:4711)

at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)

at java.awt.EventQueue.access$500(EventQueue.java:97)

at java.awt.EventQueue$3.run(EventQueue.java:709)

at java.awt.EventQueue$3.run(EventQueue.java:703)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)

at java.awt.EventQueue$4.run(EventQueue.java:731)

at java.awt.EventQueue$4.run(EventQueue.java:729)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

CONSTRUÍDO COM SUCESSO (tempo total: 1 minuto 23 segundos)
T

Senhores, alguém consegue me dizer como eu mando data e hora para mysql ?

L

Trabalhando com JDBC, você deve mandar a data usando java.sql.Date. Veja um exemplo:

SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
String stringData = "23/08/2016";

try {
	java.util.Date dateObject = format.parse(stringData);
	java.sql.Date sqlDateObject = new java.sql.Date(dateObject.getTime());
	System.out.println(sqlDateObject); // Você irá gravar no banco o objeto "sqlDateObject"
} catch (ParseException e) {
	System.out.println("Não foi possível converter a string em data!");
}
T

Estou usando um construtor que manda data e hora que pega do Jframe da caixa formatada, ai no caso e estou fazendo dessa forma, está correto ? Porque eu tenho que digitar na caixa formatada a data e hora e clico no botão enviar, quando eu clico no botão enviar ele pega o que está caixa formatada e manda para os atributos da classe dados, e no comando sql insert, eu pego os dados digitados no Jframe e manda para o mysql, mas na parte de mandar que é o problema rsrsr, poderia vericar os códigos a baixo e ver o que estou fazendo de errado por favor ?

//Botão Enviar:

private void BntEnviarActionPerformed(java.awt.event.ActionEvent evt) {      
                                
    SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
    String stringData = "23/08/2016";

    try {
        java.util.Date dateObject = format.parse(stringData);
        java.sql.Date sqlDateObject = new java.sql.Date(dateObject.getTime());
        
    } catch (ParseException e) {
        System.out.println("Não foi possível converter a string em data!");
    }
    Dados dad = new Dados(Time.valueOf(FormatadoEntrada.getText()), Time.valueOf(FormatadoSaida.getText()), Time.valueOf(FormatadoAdicional.getText()), **sqlDateObject**(FormatadoData.getText()), TxtNome.getText(), TxtEmpresa.getText(), TxtCargo.getText());

    if (new VUsuario()
            .inserirDados(dad)) {
        System.out.println("Dados iseridos");
    } else {
        System.out.println("Problemas na função inserir dados");
    }
}

//Classe dados:

public class Dados {

public Time entrada;
public Time saida;
public Time adicional;
public Date data;
public String nome;
public String empresa;
public String cargo;

public Time getEntrada() {
    return entrada;
}

public void setEntrada(Time entrada) {
    this.entrada = entrada;
}

public Time getSaida() {
    return saida;
}

public void setSaida(Time saida) {
    this.saida = saida;
}

public Time getAdicional() {
    return adicional;
}

public void setAdicional(Time adicional) {
    this.adicional = adicional;
}

public Date getData() {
    return data;
}

public void setData(Date data) {
    this.data = data;
}

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

public String getEmpresa() {
    return empresa;
}

public void setEmpresa(String empresa) {
    this.empresa = empresa;
}

public String getCargo() {
    return cargo;
}

public void setCargo(String cargo) {
    this.cargo = cargo;
}



public Dados(Time entrada, Time saida, Time adicional, Date data, String nome, String empresa, String cargo) {

    this.entrada = entrada;
    this.saida = saida;
    this.adicional = adicional;
    this.data = data;
    this.nome = nome;
    this.empresa = empresa;
    this.cargo = cargo;
}

}

//classe que manda para o BD:

public boolean inserirDados(Dados dad) {
    
    String insert = "INSERT INTO dados(entrada, saida, adicional, data, nome, empresa,cargo)VALUES(?,?,?,?,?,?,?)";
    try {
        this.conectar();
        this.stmt = this.conn.prepareStatement(insert);
        this.stmt.setTime(1, dad.getEntrada());
        this.stmt.setTime(2, dad.getSaida());
        this.stmt.setTime(3, dad.getAdicional());
        this.stmt.setDate(4, dad.getData());
        this.stmt.setString(5, dad.getNome());
        this.stmt.setString(6, dad.getEmpresa());
        this.stmt.setString(7, dad.getCargo());

        this.stmt.executeUpdate(insert);

        return true;

    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, "Erro na função inserir dados:\n" + ex.getMessage());

    }
    return false;

}

}
L

Na classe Dados, o atributo data é java.util.Date ou java.sql.Date?

T

Boa noite,

é java.sql.Date na de dados e na classe onde fica o insert.

T

Eu coloquei no construto sqlDateObject:

Queria saber se estou fazendo certo pois da erro no date do construtor.

SimpleDateFormat format = new SimpleDateFormat(“dd/MM/yyyy”);
String stringData = “23/08/2016”;

try {
    java.util.Date dateObject = format.parse(stringData);
    java.sql.Date sqlDateObject = new java.sql.Date(dateObject.getTime());
    
} catch (ParseException e) {
    System.out.println("Não foi possível converter a string em data!");
}
Dados dad = new Dados(Time.valueOf(FormatadoEntrada.getText()), Time.valueOf(FormatadoSaida.getText()), Time.valueOf(FormatadoAdicional.getText()), **sqlDateObject**(FormatadoData.getText()), TxtNome.getText(), TxtEmpresa.getText(), TxtCargo.getText());
L

O código desse jeito, dá qual erro?

T

Da erro no construtor, executei o debug, e mostra erro:

at Janelas.FrmDados.BntEnviarActionPerformed(FrmDados.java:255).

E mostra erro no sqlDateObject. Já não sei mais o que fazer:

Dados dad = new Dados(Time.valueOf(FormatadoEntrada.getText()), Time.valueOf(FormatadoSaida.getText()), Time.valueOf(FormatadoAdicional.getText()), **sqlDateObject**(FormatadoData.getText()), TxtNome.getText(), TxtEmpresa.getText(), TxtCargo.getText());
L

Tente assim:

java.sql.Date sqlDateObject = null;

try {
    java.util.Date dateObject = format.parse(stringData);
    sqlDateObject = new java.sql.Date(dateObject.getTime());
} catch (ParseException e) {
    System.out.println("Não foi possível converter a string em data!");
}

Dados dad = new Dados(Time.valueOf(FormatadoEntrada.getText()), Time.valueOf(FormatadoSaida.getText()), Time.valueOf(FormatadoAdicional.getText()), sqlDateObject, TxtNome.getText(), TxtEmpresa.getText(), TxtCargo.getText());

Uma pergunta: Pq você está usando Time.valueOf ao criar os dados?

T

Então, eu estou montando um controlador e horas trabalhadas, nada de mais, o programa é o seguinte, quando executado, vai aparecer os campos entrada, saída, adicional noturno, nome, empresa e cargo, depois de preencher os campos, o usuário vai clicar em enviar esses dados e depois vai para o banco de dados.

O Time.valueOf é para converter de String para o tipo Time. Porém eu acho que quando eu for calcular horas trabalhadas eu não vou conseguir porque eu teria que mandar no formato data e hora.

L

Recomendo trabalhar com data e hora mesmo. Será mais flexível.

Faça as mudanças e tente gravar, qualquer coisa, só avisar.

T

Então seria melhor trabalhar com data e hora no mesmo campo ?

Então não está aceitando, fica sublinhado em vermelho: format.parse(stringData) e catch (ParseException e).

Eu clico para adicionar importação mas não vai nenhuma.

L

Qual parte fica em vermelho?

T

Desculpe a demora de responder,

Então fica essa parte do código em vermelho do qual você me mandou:

format.parse(stringData) e catch (ParseException e).
Criado 6 de agosto de 2016
Ultima resposta 1 de set. de 2016
Respostas 16
Participantes 2