Data errada vindo do banco de dados

8 respostas Resolvido
javamysql
clicnet

Pessoal,
Estou com um problema na hora de receber a data e hora de uma tabela no banco mysql, o tipo de dados está definido como “datatime”, usei o método now() para gravar a data, no banco de dados aparentemente está tudo normal, o problema está na hora de pegar esses dados no java, estou usando JDBC. Na data, o mês tá vindo errado e a hora tá zerada. preciso imprimir os campos: “loja”, “status” e “data”, os outros dados estão vindo normais.
Segue abaixo o método que faz a chamada.

public ArrayList<Pedidos> listarPorId(int id_usuario) {
     Connection conn=null;
     ResultSet resultSet = null;
     PreparedStatement stmt = null;
     conn = getConnection();
     ArrayList<Pedidos> listaPedidos = null;
     try {
        stmt = conn.prepareStatement("SELECT * FROM pedidos WHERE id_usuario='"+id_usuario+"'");       
        resultSet = stmt.executeQuery();
        listaPedidos = new ArrayList<>();
        while (resultSet.next()) {

            Pedidos pedidos = new Pedidos();
             
            pedidos.setLoja(resultSet.getString("loja"));
            pedidos.setStatus(resultSet.getString("status"));
            
            Calendar data = Calendar.getInstance();
            data.setTime(resultSet.getDate("data"));
            pedidos.setData(data);
                       
             listaPedidos.add(pedidos);
        }
     } catch (SQLException e) {
         listaPedidos = null;
     } finally {
         closeConnection(conn, (Statement) stmt, resultSet);
     }
     return listaPedidos;
}

8 Respostas

L

O método getDate(String column) da interface ResultSet retorna um objeto de java.sql.Date que, necessariamente, retorna apenas ano, mês e dia.
Se você quer o retorno completo, precisa invocar o método getTimestamp(String column), que devolve ano, mês, dia, hora, minutos, segundos e milissegundos da data armazenada no banco de dados.

clicnet

Fiz a alteração que você sugeriu e a hora funcionou beleza, mas o mês continua com problemas, era pra mostrar o mês 3, só que está mostrando o mês 2.
Este é o método que estou usando para formatar a data no android:

public String getDataFormatada(){
        dia = getData().get(Calendar.DAY_OF_MONTH);
        mes = getData().get(Calendar.MONTH);
        ano  = getData().get(Calendar.YEAR);
        hora = getData().get(Calendar.HOUR);
        min = getData().get(Calendar.MINUTE);
        seg = getData().get(Calendar.SECOND);

        return dia+"-"+mes+"-"+ano+" "+hora+":"+min+":"+seg;
    }
L
Solucao aceita

Aí é outra coisa que você não se atentou: Vamos supor que a data seja “10/01/2017 10:22:30”, ok?
Quando você tem uma instância de Calendar e solicita o valor do dia (usando o caso acima como exemplo), faz isso:
int dia = getData().get(Calendar.DAY_OF_MONTH); e o resultado será 10, certo?
Mas, se for solicitar o mês, terá:
int mes = getData().get(Calendar.MONTH); e o resultado será (cara de surpreso) 0!
Mas, desde quando existe mês zero?
Desde que o calendar trata os meses como posições de um vetor, onde o primeiro mês refere-se ao índice zero e o décimo segundo mês (dezembro) refere-se ao décimo primeiro índice.
Logo, você terá que, ao solicitar o mês, somar uma unidade ao mesmo para ter o mês correto.
mes = getData().get(Calendar.MONTH) + 1;

clicnet

Tem razão foi um vacilo da minha parte, eu já tinha ouvido falar nessa questão do vetor começar com zero, acabei não prestando atenção.
Ou seja, depois dessa problema resolvido.

D

Olá sei que é um tópico antigo mas quando procurei na net sobre esse erro de recuperar data errada do banco eu cai aqui! No meu caso a data vinha errada por causa do “timezone” que usa junto URL na conexao com o bando de dados! Ex:

private static final String TIMEZONE = “?useTimezone=true&;serverTimezone=UTC”;
private static final String USER = “root”;

private static final String URL = “jdbc:mysql://localhost:3306/” + DATABASE + TIMEZONE;

O problema é que vc é obrigado a colocar esse endereço timezone para que nao de erro de conexao com o banco! vc é obrigado a colocar o TIMEZONE na URL como falam muitos videos tutoriais e foruns que fala que vc tem que ter um DRIVE de conexao! Só que poucos falam que as versoes acima do java 5 não precisa mais desse drive! Se fazer a classe de conexao sem o drive vc nao presisa colocar o endereço TIMEZONE na URL! Entao no meu caso retirei o drive e o comando DriveManeger(DRIVE); Agora minha conexao funciona normal e sem o TIMEZONE na URL as datas vem certas do Banco de Dados! Espero que isso ajude mtos que estao começando como eu!

darlan_machado

Mas, independente de qualquer coisa, se você quer pegar o mês, a partir de uma instância da classe Calendar, vai continuar precisando ler os meses a partir de 0.

D

Na verdade não usei a classe Calendar! Usei simpleDateFormat apenas p formatar o valor digitato! o meu projeto dava erro por causa do drive! que tinha q especificar esse timezone que tem haver com fuso horario ai quando retirei parou de dar erro! Descobri meio na sorte com um video que nao tinha nada haver com data hehe!!

Minha classe de conexao era assim e funcionava apenas em um projeto e em outros nao tava conseguindo conexao e nao sabia o porque:

private static final String DRIVE = "com.jdbc.driver.mysql"
private static final String DATABASE = “assistencia_tecnica”;

–> private static final String TIMEZONE = “?useTimezone=true&;serverTimezone=UTC”;
private static final String URL = “jdbc:mysql://localhost:3306/” + DATABASE + TIMEZONE;<–

public static Connection getConnection() {
    try {
    -->DriverManager.registerDriver(new com.mysql.jdbc.Driver());
        return con = DriverManager.getConnection(URL, USER, PASSWORD);

    } catch (Exception e) {
        System.out.println("Erro com a conexão! Erro: " + e.getMessage());
        return null;
    }
}

Ficou assim: sem o drive e sem endereço timezone

public static Connection getConnection() {

try {

DriverManager.registerDriver(new com.mysql.jdbc.Driver());

return con = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (Exception e) {
        System.out.println("Erro com a conexão! Erro: " + e.getMessage());
        return null;
    }
}

depois que fiz isso consegui conexao em outros projetos e tbm a data certa! no projeto q tinha conexao

darlan_machado

Narcisismo é a condição pela qual uma pessoa é incapaz de entender que, na maioria das vezes, não estamos falando dela.

Cara, eu me referi ao problema original desta publicação que não tem nada a ver com o teu problema.
E, sim, o problema original, que era o que importava no momento em que a resposta foi postada, se referia ao método get da classe Calendar, quando o parâmetro é o mês.

Sacou?

Criado 21 de março de 2017
Ultima resposta 18 de set. de 2018
Respostas 8
Participantes 4