Skip to content

传统时间类(Java 8 前)

类名所属包关键特点常见用途
Datejava.util表示毫秒时间戳,设计缺陷(月份从0开始),线程不安全。旧代码中的时间戳表示
Timestampjava.sql继承 Date,支持纳秒级精度,专用于数据库交互。数据库 TIMESTAMP 字段映射
Calendarjava.util提供日期计算功能(如增减天数),API 复杂,线程不安全。旧代码中的日期操作
SimpleDateFormatjava.text日期格式化与解析,非线程安全。旧代码中的日期字符串转换

现代时间类(Java 8+)

类名所属包关键特点常见用途
LocalDatejava.time仅日期(年-月-日),不可变,线程安全。生日、合同生效日等纯日期场景
LocalTimejava.time仅时间(时:分:秒.纳秒),不可变,线程安全。营业时间、会议开始时间
LocalDateTimejava.time日期+时间(无时区),不可变,线程安全。业务时间(如订单创建时间)
ZonedDateTimejava.time带时区的完整时间(如 Asia/Shanghai),处理夏令时,不可变。跨时区系统时间记录
Instantjava.time时间戳(UTC 时区,纳秒精度),不可变,适合机器时间。日志时间戳、高精度计时
Durationjava.time时间间隔(精确到纳秒),如 PT2H30M(2小时30分钟)。计算任务执行时长
Periodjava.time日期间隔(年/月/日),如 P1Y2M3D(1年2月3天)。计算年龄、合同周期
DateTimeFormatterjava.time.format线程安全的日期格式化工具,支持模式字符串(如 yyyy-MM-dd)。日期与字符串的互相转换

核心区别对比

特性传统类(Date/Calendar现代类(java.time
线程安全不安全(需手动同步)不可变对象,线程安全
API 设计混乱(大量废弃方法)直观(链式调用,如 plusDays(1)
时区处理依赖 TimeZone 手动调整内置时区支持(ZoneId
精度毫秒(Date)或纳秒(Timestamp纳秒(InstantLocalTime
格式化工具SimpleDateFormat(非线程安全)DateTimeFormatter(线程安全)
日期计算复杂(需用 Calendar简单(如 LocalDate.plusWeeks(1)

使用建议

• 新项目:优先使用 java.time 包(如 LocalDateTimeZonedDateTime)。 • 数据库交互:JDBC 4.2+ 直接支持 LocalDateTime,无需 Timestamp。 • 高精度需求:用 InstantLocalTime(纳秒级)。 • 时区敏感场景:始终用 ZonedDateTimeOffsetDateTime

✨ 网站运行时间: 3年11月15天 ❤️ 道阻且长,行则将至 - 微信号: heikedreamer