在 Java 中,java.util.Date(或 java.sql.Timestamp)和 java.time.LocalDateTime 是两种不同的日期时间类,主要区别如下:
特性 Date LocalDateTime
时区 隐式依赖系统时区 无时区
线程安全 否 是
可变性 可变 不可变
API 设计 老旧 现代且易用
推荐度 旧代码兼容时使用 优先选择
建议:在新项目中尽量使用 java.time 包(如 LocalDateTime),避免 Date 和 Calendar。
1. 所属包与版本
类 所属包 引入版本 设计理念
Date java.util Java 1.0 旧版 API,存在设计缺陷(如非线程安全)
LocalDateTime java.time Java 8 (JSR-310) 新版 API, immutable(不可变)且线程安全
2. 时区处理
类 时区敏感性 说明
Date 隐式依赖系统时区 内部存储 UTC 时间戳(毫秒数),但 toString() 会按系统时区显示
LocalDateTime 无时区信息 仅表示本地日期时间(如 2025-05-07T14:30:00),不涉及时区转换
示例对比
/
/ Date 的时区依赖(输出受系统默认时区影响)
Date date = new Date();
System.out.println(date); // 输出类似:Wed May 07 14:30:45 CST 2025
// LocalDateTime 无时区
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime); // 输出类似:2025-05-07T14:30:45.123
3. 可变性
类 可变性 线程安全
Date 可变(可通过 setTime() 修改) 非线程安全
LocalDateTime 不可变(所有修改操作返回新对象) 线程安全
示例
// Date 可变(不推荐)
Date date = new Date();
date.setTime(1000L); // 直接修改原始对象
// LocalDateTime 不可变
LocalDateTime now = LocalDateTime.now();
LocalDateTime future = now.plusHours(1); // 返回新对象,原对象不变
4. 功能丰富度
功能 Date LocalDateTime
日期加减 需手动计算(如 Calendar) 内置方法(如 plusDays()、minusHours())
格式化 依赖 SimpleDateFormat(非线程安全) 使用 DateTimeFormatter(线程安全)
时间单位支持 仅精确到毫秒 支持纳秒级精度
操作对比
// Date 的日期加减(繁琐)
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_MONTH, 1);
Date tomorrow = calendar.getTime();
// LocalDateTime 的日期加减(简洁)
LocalDateTime tomorrow = LocalDateTime.now().plusDays(1);
-
适用场景
场景 推荐类 原因
旧代码兼容 Date 历史遗留系统可能依赖 Date
数据库交互 java.sql.Timestamp 兼容 JDBC 驱动
新开发项目 LocalDateTime 更安全、更易用
需要时区 ZonedDateTime 明确处理时区逻辑 -
相互转换
Date → LocalDateTime
Date date = new Date();
LocalDateTime localDateTime = date.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
LocalDateTime → Date
LocalDateTime localDateTime = LocalDateTime.now();
Date date = Date.from(
localDateTime.atZone(ZoneId.systemDefault()).toInstant()
);
1107

被折叠的 条评论
为什么被折叠?



