ResultSet.getDate()返回错误的日期

卢卡斯·费雷拉

我在使用该ResultSet.getDate()方法时遇到问题我在MySQL中有一个日期字段,当我尝试获取该值时,获得的日期是今天的日期,而不是指定表中的日期。我不知道是什么导致了此错误,我搜索了其他帖子,但是其他错误getDate()有所不同,例如解析或数据不匹配错误或其他类型的错误。由于时区的缘故,这可能是一个错误,因为日期的值是从昨天开始的,但是有两行是两天前的日期,并且还返回了今天的日期。

这是代码:

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.joda.time.LocalDate;

import model.Paciente;
import teste.ConnectionFactory;

public class PacienteDao {


    // a conexão com o banco de dados
    private Connection connection;

    public PacienteDao() {
        this.connection = new ConnectionFactory().getConnection();
    }

    public void adiciona(Paciente paciente) {
        String sql = "insert into paciente" +
                " (nome_paciente,cpf_paciente,rg_paciente,data_nasc)" +

                "values (?,?,?,?)";

        try {
            PreparedStatement stmt = connection.prepareStatement(sql);

            stmt.setString(1, paciente.getNome_paciente());
            stmt.setString(2, paciente.getCpf());
            stmt.setString(3, paciente.getRg());

            java.sql.Date data_nasc = new java.sql.Date(paciente.getData_nasc().toDate().getTime());
            stmt.setDate(4, data_nasc);

            stmt.execute();
            stmt.close();

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public List<Paciente> listaPacientes() {

        List<Paciente> pacientes = new ArrayList<Paciente>();

        try {
            PreparedStatement stmt = this.connection.prepareStatement("select * from paciente");

            ResultSet rs = stmt.executeQuery();

            while (rs.next()) {
                Paciente paciente = new Paciente();
                paciente.setId_paciente(rs.getInt("id_paciente"));
                paciente.setNome_paciente(rs.getString("nome_paciente"));
                paciente.setCpf(rs.getString("cpf_paciente"));
                paciente.setRg(rs.getString("rg_paciente"));

                LocalDate dt = new LocalDate();
                dt.fromDateFields(rs.getDate("data_nasc"));
                paciente.setData_nasc(dt);

                pacientes.add(paciente);
            }

            rs.close();
            stmt.close();

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return pacientes;
    }

以下是应返回的数据(CSV):

  • “ 1”,“卢卡斯”,“ 1111111111”,“ 12222222”,“ 2017-12-19”
  • “ 2”,“卢卡斯”,“ 1111111111”,“ 12222222”,“ 2017-12-20”
  • “ 3”,“卢卡斯”,“ 1111111111”,“ 12222222”,“ 2017-12-20”
  • “ 4”,“ Leandro”,“ 2321”,“ 21232”,“ 2017-12-20”

这是返回的数据(StackTrace):

ID:1名称:Lucas CPF:1111111111 RG:12222222生日:2017-12-21

ID:2名称:Lucas CPF:1111111111 RG:12222222生日:2017-12-21

ID:3名称:Lucas CPF:1111111111 RG:12222222生日:2017-12-21

ID:4名称:Leandro CPF:2321 RG:21232出生日期:2017-12-21

就像我说的,其中一行的日期是两天前,但是它也显示了今天的日期,所以我认为这不是时区错误。

PS:变量和方法的名称是葡萄牙语,因为应用程序也是葡萄牙语。

吉姆·加里森

问题在这里

LocalDate dt = new LocalDate();
dt.fromDateFields(rs.getDate("data_nasc"));

第一条语句LocalDate为今天创建了一个新集合。第二条语句是对staticmethod的调用,fromDateFieldsIDE和/或编译器应将其标记为警告。此方法返回一个新的 LocalDate对象,您将其丢弃,并且不会进行修改dt以上应为:

LocalDate dt = LocalDate.fromDateFields(rs.getDate("data_nasc"));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章