传统时间类(Java 8 前)
| 类名 | 所属包 | 关键特点 | 常见用途 |
|---|---|---|---|
Date | java.util | 表示毫秒时间戳,设计缺陷(月份从0开始),线程不安全。 | 旧代码中的时间戳表示 |
Timestamp | java.sql | 继承 Date,支持纳秒级精度,专用于数据库交互。 | 数据库 TIMESTAMP 字段映射 |
Calendar | java.util | 提供日期计算功能(如增减天数),API 复杂,线程不安全。 | 旧代码中的日期操作 |
SimpleDateFormat | java.text | 日期格式化与解析,非线程安全。 | 旧代码中的日期字符串转换 |
现代时间类(Java 8+)
| 类名 | 所属包 | 关键特点 | 常见用途 |
|---|---|---|---|
LocalDate | java.time | 仅日期(年-月-日),不可变,线程安全。 | 生日、合同生效日等纯日期场景 |
LocalTime | java.time | 仅时间(时:分:秒.纳秒),不可变,线程安全。 | 营业时间、会议开始时间 |
LocalDateTime | java.time | 日期+时间(无时区),不可变,线程安全。 | 业务时间(如订单创建时间) |
ZonedDateTime | java.time | 带时区的完整时间(如 Asia/Shanghai),处理夏令时,不可变。 | 跨时区系统时间记录 |
Instant | java.time | 时间戳(UTC 时区,纳秒精度),不可变,适合机器时间。 | 日志时间戳、高精度计时 |
Duration | java.time | 时间间隔(精确到纳秒),如 PT2H30M(2小时30分钟)。 | 计算任务执行时长 |
Period | java.time | 日期间隔(年/月/日),如 P1Y2M3D(1年2月3天)。 | 计算年龄、合同周期 |
DateTimeFormatter | java.time.format | 线程安全的日期格式化工具,支持模式字符串(如 yyyy-MM-dd)。 | 日期与字符串的互相转换 |
核心区别对比
| 特性 | 传统类(Date/Calendar) | 现代类(java.time) |
|---|---|---|
| 线程安全 | 不安全(需手动同步) | 不可变对象,线程安全 |
| API 设计 | 混乱(大量废弃方法) | 直观(链式调用,如 plusDays(1)) |
| 时区处理 | 依赖 TimeZone 手动调整 | 内置时区支持(ZoneId) |
| 精度 | 毫秒(Date)或纳秒(Timestamp) | 纳秒(Instant、LocalTime) |
| 格式化工具 | SimpleDateFormat(非线程安全) | DateTimeFormatter(线程安全) |
| 日期计算 | 复杂(需用 Calendar) | 简单(如 LocalDate.plusWeeks(1)) |
使用建议
• 新项目:优先使用 java.time 包(如 LocalDateTime、ZonedDateTime)。 • 数据库交互:JDBC 4.2+ 直接支持 LocalDateTime,无需 Timestamp。 • 高精度需求:用 Instant 或 LocalTime(纳秒级)。 • 时区敏感场景:始终用 ZonedDateTime 或 OffsetDateTime。