[RESOLVIDO] JDateChoose, pegar apenas a hora e inverter para o banco de dados

Bom dia pessoal, procurei aqui no forum e no google mas nao conseguir achar algo que eu entendesse e/ou se encaixasse no que eu preciso…

eu possuo esse form onde eu cadastro uma divida no banco, tudo perfeito MAS eu estou travado na parte da data, quero que o usuario escolha uma data que ja esta funcionando perfeitamente no formato “dd/MM/yyyy” que eu quero…

image

Porem eu preciso fazer duas coisas :

1 - Quando o usuario clicar na checkbox “Hoje” a caixa de texto ao lado sera preenchida com o “dd/MM/yyyy” atual, nao quero horario apenas a data.

image

2 - quando eu tiver essa data armazenada em algum lugar eu quero inverter ela para “yyyy/MM/dd” pois o phpmyadmin so aceita a data nesse formato e eu nao consegui de jeito algum inverter isso inclusive se tiver como ja ajuda muito pois nao vou precisar inverter a data

em resumo :

  • no visual quero mostrar a data assim “dd/MM/yyyy”
  • por tras do codigo quero mandar para o banco assim “yyyy/MM/dd”
  • e quando a checkbox(checkDataAtual) for marcada eu quero preencher o campo ao lado(dateData) apenas com a data atual

Ja agradeco desde ja quem puder ajudar

Boa tarde, por padrão o Mysql caso esteja usando esse banco salva a data no formato “dd/MM/yyyy”.

Dentro do seu checkBox você pode chamar o método abaixo:

private void setaDataAtual() {
        java.util.Date hoje = new java.util.Date();
       JDateChoose.setDate(hoje);

    }

e para salvar no banco utilize o código abaixo:
processo.setDataProcesso(new java.sql.Date(((java.util.Date) JDateChoose.getDate()).getTime()));

o meu objeto é o processo utilize o codigo entre parenteses .

1 curtida

Obrigado, o checkbox funcionou perfeitamente, agora sobre a insercao no banco de dados eu nao consegui captar (desculpa eu estou iniciando no java)

eu tenho um metodo void que insere no banco pra mim:

 public void CadastrarDivida(String credor, Date dataAtualizacao, float valorDivida, String devedor) throws Exception{
    conn = getConnection();
    PreparedStatement create = conn.prepareStatement("INSERT INTO divida (credor, dataAtualizacao, valorDivida, devedor) VALUES ('" + credor + "', " + dataAtualizacao + "," + valorDivida + ",'" + devedor + "')");
    create.executeUpdate();
    create.close();
    System.out.println("Dados inseridos com Sucesso!");
    fecharConexao();
}

como eu colocaria essa data na variavel “dataAtualizacao” ?

e obrigado novamente!.

Errado. O MySQL segue o padrão yyyy-MM-dd.

Na realidade, para o java, quaisquer dos padrões definidos para formatação é, basicamente, uma questão estética e de apresentação, afinal, as instâncias de objeto Date, Calendar e etc trabalham com o tempo de uma forma diferente da que nós.
Isso já é um pouco diferente nas instầncias de LocalDate, por exemplo.

Em resumo, o que te permite trabalhar com qualquer “formato” de data é a conversão do objeto Date do pacote java.util em um Date do java.sql. E apenas isso.

1 curtida

Seria mais ou menos isso, queria passar a data que esta no campo “dateData” (que e o meu JDataChooser) como argumento para meu metodo :

private void btnCadastrarDividaActionPerformed(java.awt.event.ActionEvent evt) {                                                   
    // TODO add your handling code here:
    Cadastro cadastrar = new Cadastro();
    cadastrar.CadastrarDivida(txtCredor.getText(), "DATA AQUI", Float.valueOf(txtValor.getText()), txtDevedor.getText());
}

metodo em questao :

 public void CadastrarDivida(String credor, Date dataAtualizacao, float valorDivida, String devedor) throws Exception{
    conn = getConnection();
    PreparedStatement create = conn.prepareStatement("INSERT INTO divida (credor, dataAtualizacao, valorDivida, devedor) VALUES ('" + credor + "', " + dataAtualizacao + "," + valorDivida + ",'" + devedor + "')");
    create.executeUpdate();
    create.close();
    System.out.println("Dados inseridos com Sucesso!");
    fecharConexao();
}

Grato a todos ! ^-^

JDateChooser devolve um objeto de java.util.Date
Se você quer inserir em uma coluna que está definida como DATE, então, só precisa fazer isso

create.setDate(indice, new java.sql.Date(dataQueVeioDoDateChooser.getTime());

Onde índice é um número inteiro maior ou igual a 1 e correspondente ao parâmetro específico para a data.

1 curtida

Desculpe o erro, realmente o formato é yyyy-MM-dd.e não importa o formato que é salvo no banco em um relatório ou no próprio sistema Java você pode trazer no formato que quiser, o estranho é o php admin aceitar salvar somente de um jeito, como eu não tenho experiencia no php admin então não sei responder.

1 curtida

nao consegui assimilar como posso implementar seu codigo no meu problema, desculpa eu sou iniciante entao pra mim algumas coisas sao bem dificeis de entender :confused:

talvez eu tenha explicado mal mas basicamente quero aceitar essa data para o parametro do meu metodo e inserir no banco …

PreparedStatement create = conn.prepareStatement("INSERT INTO divida (credor, dataAtualizacao, valorDivida, devedor) VALUES (?, ?, ?, ?)");
create.setString(1, credor);
create.setDate(2, new java.sql.Date(dataAtualizacao.getTime()));
create.setFloat(3, valorDivida);
create.setString(4, devedor);
create.executeUpdate();
1 curtida

Iniciante não trabalha com banco de dados. Das duas uma: ou não é mais iniciante ou está pulando etapas. Qual das duas?

Assim como o @staroski sugeriu:

1 curtida

Caramba que incrivel eu nao conhecia esse metodo, voce quebrou a query em pequenas partes isso abre um leque de possibilidades, realmente nao tinha visto ainda (o professor nao chegou nessa parte kk)…

Ja sei como receber essa data e te agradeco por isso mas como eu envio ela no meu argumento??

exemplo, no meu cadastro de clientes eu envio os dados assim:

private void btnCadastroActionPerformed(java.awt.event.ActionEvent evt) {                                            
    // TODO add your handling code here:
    try {
        Cadastro sc = new Cadastro();
        sc.CadastrarCliente(txtNomeCliente.getText(), txtEndereco.getText(), txtEstado.getText(), Long.parseLong(txtTelefone.getText()), Long.parseLong(txtRG.getText()), Long.parseLong(txtCPF.getText()), txtEmail.getText());
        preencherTabelaClientes(selectClienteDBquery);
    } catch (Exception e) {
        e.printStackTrace();
        JOptionPane.showMessageDialog(null, "Erro ao cadastrar o cliente!", "ERRO", JOptionPane.ERROR_MESSAGE);
    }
}                    

vou convertendo conforme a necessidade mas… como eu faria com a data? seria algo do tipo:

dateData.getText().ToString(); ?

Seila chutei bem alto kkk espero ter conseguido me expressar melhor, gracas a voces consigo receber essa data mas como eu envio ela agora?

Claro que trabalha… como se aprende banco sem ser iniciante em banco? rs
estou aprendendo e estudando mais de 9 horas por dia com muito esforco e foco, tento pedir ajuda aqui no forum apenas quando eu REALMENTE necessito mas de resto estou sempre no youtube, forums(inclusive esse usando a ferramenta de busca) e assim vou seguindo com meu projeto de Sistema de Cobrancas, conheco a orientacao a objetos muito bem os conceitos de polimorfismo, abstracao, heranca, encapsulamento e etc… mas a linguagem java ainda sou iniciante :smile:

Assumindo que dateData é um JDateChooser:

Data data = dateData.getDate();
1 curtida

sim e um jDateChooser, obrigado voce me ajudou muito, eu consegui mas … eu meio que peguei o aprendizado que voce me deu e fiz uma especie de “Gambiarra” gostaria que voce me falasse se existe algum problema no que fiz, segue so :

Na inicializacao do form eu fiz essa instancia

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");  //porque preciso por o ano primeiro pra inserir no MySql

feito isso la no meu botao “Cadastrar Divida” eu fiz o seguinte

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

    Cadastro cadastrar = new Cadastro();
    try {
        String data = formatter.format(dateData.getDate());

        cadastrar.CadastrarDivida(txtCredor.getText(), data, Float.valueOf(txtValor.getText()), txtDevedor.getText());
        preencherTabelaDividas(selectClienteDBquery);
    } catch (Exception e) {
        JOptionPane.showConfirmDialog(null, "Nao foi possivel inserir a DIVIDA", "ERROR DIVIDA", JOptionPane.OK_OPTION);
    }
}           

percebe a loucura? kkk eu transformei minha variavel data em uma String e la no metodo que faz a insercao no banco ele ficou assim

public void CadastrarDivida(String credor, String dataAtualizacao, float valorDivida, String devedor) throws Exception{
    conn = getConnection();
    PreparedStatement create = conn.prepareStatement("INSERT INTO divida (credor, dataAtualizacao, valorDivida, devedor) VALUES ('" + credor + "', '" + dataAtualizacao + "'," + valorDivida + ",'" + devedor + "')");
    create.executeUpdate();
    create.close();
    System.out.println("Dados inseridos com Sucesso!");
    fecharConexao();
}

Isso pode me causar algum problema? foi inserido com sucesso me senti ate um programador de verdade fazendo essa gambiarra (brincadeira hein gente mas convenhamos uma gambiarra bem feita faz milagres) .

fazendo da outra forma onde meu metodo recebe “Date dataAtualizacao” quando eu envio a data ele causa erro, veja so :

Aqui ele recebe a data e armazena

os dados sao passados mas entra no catch, o que poderia ser?

Esquece gente, burrice minha eu esqueci de implementar o getDate no metodo que insere no banco de dados.


Mensagem pra voce jovem mancebo que esta vendo esse topico daqui 3 anos com o mesmo problema, faca o seguinte :

  • Atribua uma variavel do tipo data sem necessidade de converter e passe como argumento :

    Date data = dateData.getDate();
          
          cadastrar.CadastrarDivida(txtCredor.getText(), data, Float.valueOf(txtValor.getText()), txtDevedor.getText());
    
  • Depois dentro do metodo que voce insere no banco, faca como o amigo @staroski mencionou la em cima, quebre o statement em varias partes e na data faca a conversao, fechou?, bons estudos!


Enfim rapazeada obrigado por tudo voces sao feras demais, eu realmente nao sei expressar minha felicidade, sucesso para todos voces na vida e muitos “talkeis”

@darlan_machado @staroski @jallisson_jallis

Você só fez isso porque está insistindo em inserir a data como String, não deveria, insira como Date e deixe o próprio driver do banco se resolver.

Utilize Date:

Date data = dateData.getDate();

Nomes de métodos deveriam começar em letra minúscula.
Mude o tipo do parâmetro dataAtualizacao de String para Date:

public void CadastrarDivida(String credor, Date dataAtualizacao, float valorDivida, String devedor) throws Exception{

Você está usando um PreparedStatement, então não se concatena os parâmetros na query, ao invés disso você usa o método set apropriado, como já foi postado anteriormente:

PreparedStatement create = conn.prepareStatement("INSERT INTO divida (credor, dataAtualizacao, valorDivida, devedor) VALUES (?, ?, ?, ?)");
create.setString(1, credor);
create.setDate(2, new java.sql.Date(dataAtualizacao.getTime()));
create.setFloat(3, valorDivida);
create.setString(4, devedor);
create.executeUpdate();
1 curtida

Ou seja, está pulando etapas.
Ou você faz o caminho correto ou vai ter estes problemas.

desculpa defender mas nao pulei nao kk infelizmente o curso tecnico que faco so e um pouco lento e em todo lugar que pesquisei sobre trabalhar com datas era um problema pra muitos exceto pra que ja sabe ne rs ^-^ mas todos os problemas que tive eu aprendi com eles pesquisando e prossigo assim, esse foi um caso especial que eu realmente nao achei solucao que eu conseguisse entender como do amigo staroski que entendi perfeitamente e provavelmente nao voltarei a ter problemas, aprendi muito hoje!

@staroski obrigado pelas dicas, vou modificar o codigo com esses conceitos, grato de verdade!