[Resolvido] É possível pegar a hora através de um DateChooser?

Tenho colunas “data” (formato date) e “hora” (formato character varying) no banco (Postgres). A data eu pego através de um DateChooser (para dar a liberdade do usuário alterá-la antes de salvar os dados no banco). A hora eu seto a hora atual do sistema em um jLabel e dali jogo pro banco como String.

Só que agora estou criando diversos gráficos e um deles é do tipo “TimeSeries”, na qual datas sao a base do gráfico (no eixo X). Isso me causou um problema porque eu quero mostrar a hora junto com a data no gráfico, só que nao é possível porque estou salvando data e hora separadamente.

Acredito que a solucao mais simples seria simplesmente formatar a data que eu pego no jDateChooser pra aparecer também a hora, mas estou perdido na forma correta de fazer e nao sei nem se é possível fazer isso.

Voces sabem se 1) É possível?, 2) Como isso deve ser feito?

Assim é que eu jogo a data pro banco:

mod.setData(jDateChooserData.getDate());

Imagino que eu tenha que fazer alguma conversao tipo DateFormat(“dd/MM/yyyy HH:mm:ss”), mas nao consegui pegar a lógica de fazer isso pra salvar no banco.

PS: No banco eu teria que alterar o formato de date pra Timestamp, correto?

@Lecobo
Fala dev, boa noite, blz?
É 100% possível e muito simples, segue um exemplo:

public void test(){
       JDateChooser jDateChooser = new JDateChooser();
       jDateChooser.setDate(new Date());
       System.out.println(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(jDateChooser.getDate()));
}

no banco de dados é recomendável usar TimeStamp mesmo.

1 curtida

Boa mano, muito obrigado, entao realmente funciona!!

Mas de que forma eu jogaria isso pro banco? Tudo que eu tentei me dá a data certinha, mas a hora sempre sai 00:00:00.

Desculpa se to deixando passar alguma coisa óbvia, mas essa parte da lógica nao tá entrando na minha cabeca. Qual seria a forma correta de passar o DateChooser assim convertido com a hora pro meu “mod” pra jogar pro banco? Tipo o que eu faco passando só a data:

mod.setData(jDateChooserData.getDate());

o que vc pode fazer também é complementar a data com a hora atual no momento do set, porém fazer isso com a classe Date da muito trabalho…vc pode usar o LocalDateTime que acho muito melhor, vou passar dois exemplos:

public Date adjustForActualTime(Date date) {
    try {
        return new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").parse(new SimpleDateFormat("dd/MM/yyyy").format(date).concat(new SimpleDateFormat(" HH:mm:ss").format(new Date())));
    } catch (Exception e) {
        e.printStackTrace();
    }
    return date;
}

public Date adjustForActualTime2(Date date) {
    return new Date(ZonedDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).with(LocalTime.now()).toInstant().toEpochMilli());
}

Espero que ajude, boa sorte.

1 curtida

Sim, show de bola, eu já consigo fazer a data aparecer com a hora em TextFields, etc.

Mas agora veio outra dúvida/problema… Qual a forma correta de converter de date pra Timestamp? Bom, na verdade eu consigo converter, minha dificuldade é como converter na hora de jogar no banco. Por exemplo, assim eu consigo converter de date pra timestamp tranquilo:

Date data = new Date();  
Timestamp ts = new Timestamp(data.getTime());  
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
System.out.println(sdf.format(ts));  

Mas como eu faco a conversao pra hora de jogar no banco? Como pegar a data do DateChooser e transformar em um Java.sql.Timestamp? Mais precisamente como pegar a data em formato Timestamp aqui:

mod.setData(jDateChooserData.getDate());

Imagino que aqui eu apenas trocaria o “getDate” por “getTime”, certo? Minha duvida é como converter antes, do DateChooser (java.util.date) pra java.sql.Timestamp.

Obs.: Já alterei o formato no banco, meus getters e setters, DAO, etc. Travei mesmo na hora de fazer a conversao da data do DateChooser pra Timestamp.

@Lecobo
Geralmente eu não faço conversão nenhuma, o Date já costuma ser aceito pelos banco em campos com o formato TimeStamp, a não ser que você esteja fazendo de alguma forma diferente.
Você usa Hibernate ou algum outro framework pra JPA ou está usando Sql puro?

Nao nao, SQL puro.

@Lecobo
Então é bem simples, é só fazer set do valor diretamente com o tipo java.util.Date e o banco vai aceitar pq o formato é o mesmo.

public void test() {
    try {
        Class.forName("org.apache.derby.jdbc.ClientDriver");
        Connection conn = DriverManager.getConnection("jdbc:derby://10.10.11.122:1527/home/databases/sres_db", "root", "");
        PreparedStatement prepareStatement = conn.prepareStatement("INSERT INTO CAD_TESTE (ID, DATA_REALIZACAO) VALUES (?, ?)");
        prepareStatement.setObject(1, 1L);
        prepareStatement.setObject(2, new Date());
        prepareStatement.execute();
        conn.close();
    } catch (Exception e) {
    }
}
1 curtida

Posta o código desse setData

Não tem que fazer conversão nenhuma, se sua coluna do banco é do tipo DATE TIME basta você fazer um setTimestamp com seu PreparedStatement.

public void Salvar(Pedido dados) throws SQLException {
    String SQL;
    SQL = "INSERT INTO PEDIDO (IDCLIENTE, ITENPEDIDO, DATAPEDIDO) VALUES (?,?,?)";
    
    PreparedStatement insereSt = null;
    Connection cnx = ConnectionFactory.getInstance().getConexao();

    try {
        cnx.setAutoCommit(false);

        insereSt = cnx.prepareStatement(SQL);

        insereSt.setInt(1, dados.getIDCliente());
        insereSt.setString(2, dados.getItenPedido());
        Timestamp t = new Timestamp(dados.getDataPedido().getTime());//dados.getDataPedido() é um java.sql.Date
        insereSt.setTimestamp(3, t);
        
        insereSt.executeUpdate();
        cnx.commit();

    } catch (SQLException e) {
        cnx.rollback();
        cnx.setAutoCommit(true);

        System.out.println("Erro ao inserir pedido: " + e.getMessage() + "\n");
        JOptionPane.showMessageDialog(null, "Erro ao inserir pedido: " + e.getMessage() + "\n");
    } finally {
        try {
            cnx.setAutoCommit(true);
            insereSt.close();
        } catch (SQLException e) {
            System.out.println("Erro ao encerrar conexão: " + e.getMessage());
            JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão: " + e.getMessage());
        }
    }
}
1 curtida

É a classe dos getters e setters:

private Timestamp data;

public Timestamp getData() {
    return data;
}

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

No Prepared Statement tá assim:

pst.setTimestamp(10, mod.getData());
  1. No PostgreSQL, o equivalente ao “DATE TIME” é o Timestamp, não? Ou existe “DATE TIME” no Postgres?

  2. A questao da conversao é por estar puxando a data do DateChooser. O DateChooser traz um “Date normal” por assim dizer, nao?! E pro banco precisaria enviar como Timestamp. Olha a foto, se eu tento fazer “direto” é isso que acontece:

JAVADATE

Por isso que na minha cabeca, em algum ponto do código tem que ser feita algum tipo de conversao. Imagino que tenha que puxar com “getTime” ali no “mod”. E até mesmo setar o DateChooser pra mostrar com a hora, no momento eu nao faco isso (tentei mas a lógica nao entrou na minha cabeca, tentei de várias formas e cada vez saia um erro diferente), imagino que seria necessário.

@Lecobo

Cara…a única coisa errada no seu código é sua classe de entidade…

//private Timestamp data;
private Date data;

//public TimeStamp getData(){ 
public Date getData() {
       return data;
}

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

É só fazer essa alteração e salvar no banco que vai funcionar;

De que forma tu pega a data? O usuário digita em algum campo, DateChooser, pega automático do sistema…?

Porque, por exemplo, como eu pego do DateChooser, precisaria converter de util.date (que sai do DateChooser) pra um sql.Date. Mesmo problema do Timestamp, já que nao to conseguindo fazer isso.

Mas aí que tá…

Se eu mando pro banco como util.Date normal do Java pra um Timestamp no banco, a data vai certa, mas a hora fica 00:00:00.

Se eu mantenho como Timestamp no Java, o NetBeans acusa que “Date” e “Timestamp” sao incompatíveis. Mesma coisa se deixo como sql.Date.

Por isso digo que precisa de alguma conversao aí no meio do caminho. Ou entao usar outra coisa que nao seja o DateChooser (mas que tenha funcionalidade e aparencia muito similar), ou até mesmo outro formato que nao sejam esses util.Date e sql.Date, porque pelo que andei pesquisando já estao relativamente ultrapassados, mas se me falta conhecimento desses dois imagine de outros que nunca utilizei (como a LocalDate que vc citou acima)…

Você tem que criar o Timestamp a partir do Date que você obteve.

Date date = jDateChooserData.getDate();
Timestamp timestamp = new Timestamp(date.getTime());
mod.setData(timestamp);
1 curtida

Isso!!!

Valeu demais, funcionou!