我在使用 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?
rs.getTimestamp("R_DATETIME")
返回的值和类型:rs.getTimestamp("R_DATETIME")
方法返回一个 java.sql.Timestamp
对象。例如,如果数据库中的R_DATETIME
是“2024-09-30 12:34:56”,这就是应该检索的值。
setCreatedDate()
的功能:setCreatedDate(Timestamp createdDate)
类中的Receipt
方法用于设置createdDate
对象的Receipt
属性。它存储 Timestamp
对象而不进行任何修改。
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
进行映射,如下表中所示:
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();
从