Data gravada no banco invertendo o ano com dia

4 respostas Resolvido
java
N

Não sei se já existe este tópico, se sim me perdoem, já procurei tanto que cansei.

//entrada de dados com mascara em um campo texto

try{

  lblData = new JLabel("Data: (dd mm aa)");  //por ex.01/04/16
  lblData.setFont(new Font("Arial",Font.BOLD,16));
  MaskFormatter mascaraData = new MaskFormatter("##/##/##");
  mascaraData.setValidCharacters("[telefone removido]");
  txtData = new JFormattedTextField(mascaraData);
  txtData.setFont(new Font("Arial",Font.BOLD,16));

}catch(ParseException p) {
    JOptionPane.showMessageDialog(null,"Erro ao inserir m\u00e1scara de data: " + p);
}


//recupero o valor inserido
String dat = txtData.getText();
dat = dat.replaceAll("[/]","");

 //tentei fazer uma conversão, mas não deu certo, o sistema ignorou
// CastStringParaData cast = new CastStringParaData();
//Date dt = cast.converte(dat);

//gambiarra para gravar a data corretamente - não quero isso
char char1 = dat.charAt(0);
char char2 = dat.charAt(1);
char char3 = dat.charAt(2);
char char4 = dat.charAt(3);
char char5 = dat.charAt(4);
char char6 = dat.charAt(5);
String dt = ""+char5+char6+char3+char4+char1+char2; 

 //tabela criada – tipo da data é DATE
   String criaAbreTabelaFarda = "CREATE TABLE IF NOT EXISTS farda(codigo int(4) not null auto_increment,data date,descricao varchar(50),aluno varchar(50),serie  varchar(25),turno char(7),valor decimal(6,2),primary key(codigo))";
stm.execute(criaAbreTabelaFarda);

//data será gravada no banco mysql
pstm = con.prepareStatement(insereDados);
pstm.setString(1,dt);

//classe para fazer a conversão de string para date

public class CastStringParaData {

public Date converte(String data) throws ParseException {
    //converte string para sql.Date
    SimpleDateFormat dtaformatada = new SimpleDateFormat("yyyy/MM/dd"); //também tentei dd/MM/yyyy sem sucesso

    java.util.Date utilDate = dtaformatada.parse(data);
    long time = utilDate.getTime();
    java.sql.Date datanasc = new java.sql.Date(time);
    return datanasc;

    }

}

O problema: já tentei de tudo, ou dá erro ou a data é gravada incorreta. Se entro com 01/04/16 é gravado no banco 16/04/2001. Sei que no banco é gravado yyyy/mm/dd. Não consigo de forma alguma gravar a data de forma correta. Entendam, o sistema não está gravando 2016/04/01(o que não teria problema) e sim considerando o dia como ano e o ano como dia. Por favor me ajudem. Grata, Nathalie Maria

4 Respostas

A
Solucao aceita

Você está usando o java.util.Date ou java.sql.Date, para persistir no banco?
Se estiver usando a primeira opção, converta pela segunda.

N

Oi Aledro, obrigada pela resposta. Estou usando java.sql.Date. Observe que anteriormente tentei usar uma classe que faz a conversão - CasStrintParaData - que faz a conversão de util.Date para sql.Date e não deu certo. A princípio para aprender persistência, estava gravando como string (pstm.setString(1,data); ). Até aí tudo funcionava bem. Mas sei que o melhor é que o campo data da tabela seja do tipo date. Já fiz tantas conversões que não sei mais o que fazer. Sinceramente, ainda não entendi como fazer, por isso estou me confundindo tanto. Se puder me ajudar eu agradeço. E esta gambiarra não funciona, dá erro ao tentar recuperar a data. Grata,Nathalie Maria

A

Mas, está gravando corretamente? Pois o Date trabalha com milessegundos e para alguns banco, como o sql server, não é necessário fazer a conversão, para gravar, somente para apresentar a data.

N

Oi Aledro. Como havia dito, não estava entendendo nada por isso não conseguia fazer a conversão. Pesquisei mais ainda, estudei e fiz este código para exemplificar que agora entendi:

import javax.swing.<em>;

import java.sql.</em>;

import java.text.<em>;

import java.awt.event.</em>;

public class BancoTeste {

private static Connection con = null;
    private static Statement stm = null;
    private static PreparedStatement pstm = null;
    private static java.sql.Date data = null;    
    private static java.util.Date dataUtil;
    private static JTextField texto = null;
    
public static void main(String[] args) {        

    try{
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://localhost:3306","root","root");
    }catch(ClassNotFoundException c) {
        JOptionPane.showMessageDialog(null,"Driver JDBC n\u00e3o encontrado - " + c);
    }catch(SQLException e) {
        JOptionPane.showMessageDialog(null,"Conex\u00e3o MySQL n\u00e3o ocorreu - " + e);
    }
    
    try{
        stm = con.createStatement();
        stm.execute("CREATE DATABASE IF NOT EXISTS teste");
        stm.execute("USE teste");
        stm.execute("CREATE TABLE IF NOT EXISTS tabela(data date)");
        //stm.close();
    }catch(SQLException e) {
        JOptionPane.showMessageDialog(null,"Erro no banco de dados - " + e);
    }        
    
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(200,100);
    frame.setLocationRelativeTo(null);
    
    JPanel painel = new JPanel();
    
    JLabel label = new JLabel("Data:");
    texto = new JTextField(10);
    JButton botao = new JButton("gravar");
    botao.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            
            String dataString = texto.getText();
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            
            try{
                dataUtil = sdf.parse(dataString); //converte string para util.Date
            }catch(ParseException p) {
                JOptionPane.showMessageDialog(null,"Erro ao converter - " + p);
            }
            
            java.sql.Date dataSql = new java.sql.Date(dataUtil.getTime()); //converte util.Date para sql.Date
                            
            try{
                pstm = con.prepareStatement("INSERT INTO tabela(data) VALUES(?)");
                pstm.setDate(1,dataSql);
                pstm.execute();
                pstm.close();
            }catch(SQLException s) {
                JOptionPane.showMessageDialog(null,"Erro ao inserir dados - " + e);
            }
        }
    });
    
    JButton listar = new JButton("listar");
    listar.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            try{
            //formata exibição da data recuperada do banco
            SimpleDateFormat formata = new SimpleDateFormat("dd/MM/yyyy");
            ResultSet rs = stm.executeQuery("SELECT * FROM tabela");
            while(rs.next()) {
                Date dataBanco = rs.getDate(1);
                
                JOptionPane.showMessageDialog(null,"Data - " + formata.format(dataBanco));
            }
            }catch(SQLException q) {
                JOptionPane.showMessageDialog(null,"Erro ao recuperar dados - " + q);
            }
        }
    });
    
    painel.add(label);
    painel.add(texto);
    painel.add(botao);
    painel.add(listar);
    
    frame.add(painel);
    
    frame.setVisible(true);        
}

}

Testei e rodou corretamente. Obrigada pela sua ajuda, essa questão do Date ser util ou sql é quem faz a diferença. Abraços, Nathalie Maria

Criado 27 de abril de 2016
Ultima resposta 28 de abr. de 2016
Respostas 4
Participantes 2