更多面试题请看这里:https://interview.raoyunsoft.com/

🕰️ 核心区别与设计目的

  1. java.util.Date

    • 表示日期和时间的完整时间戳(精确到毫秒)
    • 包含年、月、日、时、分、秒、毫秒信息
    • 是 Java 标准库中通用的日期时间类
    • 示例:new Date() 输出 Thu May 16 14:30:45 CST 2024
  2. java.sql.Date

    • 专为 SQL 数据库设计的子类(继承自 java.util.Date
    • 仅保留日期部分(年、月、日),时间部分强制归零
    • 用于匹配数据库的 DATE 类型(如 MySQL DATE)
    • 示例:new java.sql.Date(System.currentTimeMillis()) 输出 2024-05-16
// 典型用法对比
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; // 取整到天数
    }
}

💡 使用建议

  1. 新旧系统交互
    遗留系统需转换时,优先通过 Instant 中转:

    java.util.Date utilDate = Date.from(instant);
    java.sql.Date sqlDate = java.sql.Date.valueOf(localDate);
    
  2. 全新项目
    禁止直接使用这两个类!全面采用 java.time 包下的:

    • LocalDate
    • LocalTime
    • LocalDateTime
    • ZonedDateTime
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐