Java SQL 日期转换问题:年份显示不正确

问题描述 投票:0回答:1

我在使用 Java 从 SQL 数据库检索日期时遇到问题。返回的年份在数据库中显示为 2024,但是当我通过 DAO 获取它时,年份会转换为 2024 - 543 = 1481。我已确认 SQL 查询返回正确的年份 (2024)。

这是我的 DAO 和服务代码的片段:

@Override
public List<Receipt> getAll() {
    ArrayList<Receipt> list = new ArrayList<>();
    String sql = "SELECT * FROM RECEIPT";
    Connection conn = DatabaseHelper.getConnect();
    try {
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        
        while (rs.next()) {
            Receipt receipt = Receipt.fromResultSet(rs);
            list.add(receipt);
        }
    } catch (SQLException ex) {
        System.out.println(ex.getMessage());
    }
    return list;
}

public static Receipt fromResultSet(ResultSet rs) {
    Receipt receipt = new Receipt();
    try {
        receipt.setId(rs.getInt("RECEIPT_ID"));
        receipt.setCreatedDate(rs.getTimestamp("R_DATETIME"));
        receipt.setTotal(rs.getDouble("R_TOTAL_PRICE"));
        receipt.setReceived(rs.getDouble("R_AMOUNT_RECEIVED"));
        receipt.setChange(rs.getDouble("R_CHANGE"));
        receipt.setTotalQuantity(rs.getInt("R_QTY"));
        receipt.setBranchId(rs.getInt("BRANCH_ID"));
        receipt.setUserId(rs.getInt("USER_ID"));
        receipt.setCustomerId(rs.getInt("CUSTOMER_ID"));
        receipt.setPaymentCode(rs.getInt("PAYMENT_CODE"));
        receipt.setPromotionID(rs.getInt("PROMOTION_ID"));
    } catch (SQLException ex) {
        Logger.getLogger(Receipt.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }
    return receipt;
}
public List<Receipt> getReceipts() {
    ReceiptDao receiptDao = new ReceiptDao();
    return receiptDao.getAll();
}

附加信息: 我已经尝试更改 Windows 系统上的区域设置,看看这是否会影响输出,但问题仍然存在。 数据库中的 R_DATETIME 字段正确存储为 TIMESTAMP。 问题: 为什么在我的 Java 应用程序中检索年份时显示不正确?如何确保它显示为 2024 而不是转换为 1481?

  1. rs.getTimestamp("R_DATETIME")
    返回的值和类型:
    rs.getTimestamp("R_DATETIME")
    方法返回一个
    java.sql.Timestamp
    对象。例如,如果数据库中的
    R_DATETIME
    是“2024-09-30 12:34:56”,这就是应该检索的值。

  2. setCreatedDate()
    的功能:
    setCreatedDate(Timestamp createdDate)
    类中的
    Receipt
    方法用于设置
    createdDate
    对象的
    Receipt
    属性。它存储
    Timestamp
    对象而不进行任何修改。

java datetime netbeans
1个回答
0
投票

java.time

2014 年 3 月,Java 8 引入了现代的

java.time
日期时间 API,取代了容易出错的遗留
java.util
日期时间 API。任何新代码都应使用
java.time
API。如果您收到
java.util.Date
的实例,请使用
java.time.Instant
 将其转换为 
Date#toInstant
,并根据您的要求从中派生
java.time
的其他日期时间类。

TIMESTAMP
LocalDateTime
进行映射,如下表中所示:

ANSI SQLJava SE 8日期本地日期时间当地时间时间戳本地日期时间时区时间偏移时间带时区的时间戳偏移日期时间
如何在JDBC中使用?

下面给出了将

LocalDateTime

 插入 
columnfoo
(属于 
DATE
 类型)的示例代码:

LocalDateTime ldt = LocalDateTime.now(); PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)"); st.setObject(1, ldt); st.executeUpdate(); st.close();
下面给出的是从 

LocalDateTime

 检索 
columnfoo
 的示例代码:

Statement st = conn.createStatement(); ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE <some condition>"); while (rs.next()) { // Assuming the column index of columnfoo is 1 LocalDateTime ldt = rs.getObject(1, LocalDateTime.class)); System.out.println(ldt); } rs.close(); st.close();

Trail:日期时间了解有关现代日期时间 API 的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.