Java 8+ 时间处理应聚焦 LocalDate、LocalDateTime、ZonedDateTime 三类场景,坚持不可变性与职责分离;格式化用线程安全的 DateTimeFormatter;时间差区分 Period(日历单位)与 Duration(纳秒精度);注意时区、数据库交互及时间比较规范。

直接上手 Java 8+ 的 java.time API,不绕弯、不回头。核心不是背类名,而是理解“不可变性”和“职责分离”这两条设计主线——学得快、用得稳、改得少。
聚焦三类高频场景,按需选型
别一上来就啃全量 API。先明确你要解决什么问题:
-
只管日期(如生日、合同生效日)→ 用
LocalDate:无时分秒干扰,plusMonths(3)、isBefore(other)直接可用 -
要带时间但不涉及时区(如本地日志时间戳、数据库 datetime 字段)→ 用
LocalDateTime:支持plusSeconds(45)、withHour(14),链式调用自然流畅 -
必须跨时区(如全球订单创建时间、航班起飞时间)→ 用
ZonedDateTime:它内部封装了时区逻辑,withZoneSameInstant(ZoneId.of("Asia/Shanghai"))一行就能转换
格式化与解析必须用 DateTimeFormatter
SimpleDateFormat 是历史包袱,线程不安全,且每次 new 都开销大。而 DateTimeFormatter 是不可变的、线程安全的、可复用的:
- 预定义常量够用:
DateTimeFormatter.ISO_LOCAL_DATE(2026-10-08)、DateTimeFormatter.BASIC_ISO_DATE(20261008) - 自定义模式推荐静态复用:
private static final DateTimeFormatter FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") - 解析字符串时注意异常:
LocalDateTime.parse("2026-10-08 12:06:00", FMT),格式不对直接抛DateTimeParseException,比 try-catch 更早暴露问题
时间差计算分清 Period 和 Duration
这是最容易混淆的点:
立即学习“Java免费学习笔记(深入)”;
-
Period处理“日历单位”:比如“相差 2 年 3 个月 5 天”,适用于年龄计算、合同期限。用法:Period.between(startDate, endDate) -
Duration处理“精确时间长度”:比如“相差 7200 秒”或“3.5 小时”,适用于超时控制、性能耗时统计。用法:Duration.between(instant1, instant2).getSeconds() - 关键区别:
Period基于日期字段(年月日),Duration基于纳秒刻度;前者不能用于LocalDateTime直接加减,后者可以
实战中绕不开的几个细节
这些坑踩过一次,后面就省心了:
-
LocalDateTime.now()拿的是系统默认时区的本地时间,不是 UTC;如果业务要求统一时区,请用Instant.now()或ZonedDateTime.now(ZoneOffset.UTC) - 数据库交互时,JDBC 4.2+ 支持直接传
LocalDateTime和OffsetDateTime,避免手动转Timestamp - 不要用
new Date().getTime()做时间比较,改用Instant.now().toEpochMilli(),语义更清晰,且与java.time生态对齐


















