在 Java 中,java.util.Date 和 java.time.LocalDateTime 是用于处理日期和时间的两种不同的类,它们的区别主要在于设计理念、功能特性以及适用场景。以下是它们的对比及使用建议:
java.util.Datejava.util(旧版日期时间 API)Date 对象的值可以被修改(如通过 setTime)。0 开始(0 代表一月),年份从 1900 开始,易出错。getYear()、setMonth() 已废弃),推荐改用 Calendar 类(但 Calendar 同样存在问题)。java.time.LocalDateTimejava.time(Java 8+ 引入的新日期时间 API,JSR 310)2023-10-05T14:30:00。1 到 12,日期时间处理直观。plusDays()、withHour() 等方法)。java.time 类(如 ZonedDateTime、Instant)灵活组合,处理时区转换。特性 | Date | LocalDateTime |
|---|---|---|
时区 | 隐含时区(依赖系统默认时区) | 无时区(纯本地时间) |
可变性 | 可变(非线程安全) | 不可变(线程安全) |
设计 | 过时、易出错 | 现代、直观、类型安全 |
精度 | 毫秒 | 纳秒 |
时区支持 | 需配合 Calendar/TimeZone | 需结合 ZonedDateTime 或 OffsetDateTime |
Date 的场景Date 的旧 API、库(如 JDBC、某些第三方库)交互时。java.time.Instant)。LocalDateTime 的场景Date 的月份从 0 开始等陷阱。新项目优先使用 java.time:Java 8+ 的项目应尽量使用 java.time 包中的类(LocalDateTime、ZonedDateTime、Instant 等)。
明确时区需求:
ZonedDateTime 或 OffsetDateTime。Instant(替代 Date)。转换工具:
Date → LocalDateTime:
Date date = new Date();
LocalDateTime ldt = date.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime();LocalDateTime → Date:
LocalDateTime ldt = LocalDateTime.now();
Date date = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());Date:除非必须与旧代码交互,否则避免使用 Date 和 Calendar。LocalDateTime:处理本地时间时,使用 LocalDateTime;需要时区时,结合 ZonedDateTime 或 OffsetDateTime。java.time 的强大功能:如日期计算、格式化(DateTimeFormatter)、时区转换等。