在 Java 中,java.util.Date
和 java.time.LocalDateTime
是用于处理日期和时间的两种不同的类,它们的区别主要在于设计理念、功能特性以及适用场景。以下是它们的对比及使用建议:
java.util.Date
java.util
(旧版日期时间 API)Date
对象的值可以被修改(如通过 setTime
)。0
开始(0 代表一月),年份从 1900 开始,易出错。getYear()
、setMonth()
已废弃),推荐改用 Calendar
类(但 Calendar
同样存在问题)。java.time.LocalDateTime
java.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
)、时区转换等。