Java 中 java.util.Date 与 java.sql.Date 有什么区别?
·
更多面试题请看这里:https://interview.raoyunsoft.com/
🕰️ 核心区别与设计目的
-
java.util.Date
- 表示日期和时间的完整时间戳(精确到毫秒)
- 包含年、月、日、时、分、秒、毫秒信息
- 是 Java 标准库中通用的日期时间类
- 示例:
new Date()输出Thu May 16 14:30:45 CST 2024
-
java.sql.Date
- 专为 SQL 数据库设计的子类(继承自
java.util.Date) - 仅保留日期部分(年、月、日),时间部分强制归零
- 用于匹配数据库的
DATE类型(如 MySQL DATE) - 示例:
new java.sql.Date(System.currentTimeMillis())输出2024-05-16
- 专为 SQL 数据库设计的子类(继承自
// 典型用法对比
java.util.Date utilDate = new Date(); // 包含时间
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); // 时间被截断
System.out.println(utilDate); // 输出: Thu May 16 14:30:45 CST 2024
System.out.println(sqlDate); // 输出: 2024-05-16
⚠️ 关键差异总结
| 特性 | java.util.Date | java.sql.Date |
|---|---|---|
| 时间精度 | 毫秒级完整时间戳 | 仅日期(时间强制为 00:00:00) |
| 设计用途 | 通用时间表示 | 专为 JDBC/SQL 交互设计 |
| 数据库映射 | 无直接对应类型 | 对应 SQL 的 DATE 类型 |
| 时间部分处理 | 保留时分秒毫秒 | 存储时丢弃,读取时补零 |
| 是否推荐使用 | ❌ 过时(推荐用 java.time) |
❌ 过时(推荐用 LocalDate) |
🔄 类型转换场景
当需要在两者间转换时(如从数据库读取后处理业务逻辑):
// 1. util.Date → sql.Date(丢失时间信息)
java.util.Date utilDate = new Date();
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
// 2. sql.Date → util.Date(时间补零)
java.util.Date recoveredDate = new Date(sqlDate.getTime());
System.out.println(recoveredDate); // 输出: Thu May 16 00:00:00 CST 2024
🚫 过时问题与现代替代方案
两者均已过时!Java 8+ 应优先使用 java.time API:
- 用
LocalDate替代java.sql.Date - 用
LocalDateTime替代java.util.Date - JDBC 支持直接转换:
// 现代写法(避免使用 sql.Date) LocalDate date = resultSet.getObject("column", LocalDate.class); preparedStatement.setObject(1, LocalDate.now());
⚡ 为什么时间部分会被截断?
java.sql.Date 在存储时会自动清除时间部分,其源码实现如下:
public class java.sql.Date extends java.util.Date {
@Override
public void setTime(long time) {
super.setTime(normalizeTime(time)); // 标准化为当日的00:00:00
}
private static long normalizeTime(long t) {
return (t / 86400000) * 86400000; // 取整到天数
}
}
💡 使用建议
-
新旧系统交互:
遗留系统需转换时,优先通过Instant中转:java.util.Date utilDate = Date.from(instant); java.sql.Date sqlDate = java.sql.Date.valueOf(localDate); -
全新项目:
禁止直接使用这两个类!全面采用java.time包下的:LocalDateLocalTimeLocalDateTimeZonedDateTime
更多推荐



所有评论(0)