掌握java 8+日期时间api的关键是理解设计逻辑:localdatetime(无时区业务时间)、instant(utc时间戳)、zoneddatetime(带时区用户时间)三类核心对象分工明确,配合“加减查改”四步法及datetimeformatter统一格式化。

掌握 Java 8+ 新日期时间 API 的关键,不是死记所有类名和方法,而是理解设计逻辑、分清使用场景、通过高频操作形成肌肉记忆。它比老 API(Date/Calendar)更直观,但需要切换思维——从“可变对象+手工计算”转向“不可变对象+函数式操作”。
先搞懂三类核心对象的分工
别一上来就背所有类。日常开发 90% 场景靠这三个就够了:
-
LocalDateTime:只管“年月日时分秒”,不带时区,适合业务系统内部记录创建时间、订单时间、日志时间等。比如
LocalDateTime.now()或LocalDateTime.of(2026, 10, 13, 9, 30)。 -
Instant:纯时间戳,表示 UTC 时间线上的一个点(纳秒级),适合系统间交互、数据库存储、性能打点。例如
Instant.now()、instant.toEpochMilli()可无缝对接老系统的时间戳。 -
ZonedDateTime:带时区的完整时间,用于显示给用户看(如“北京时间 2026-10-13 09:30”)、跨时区调度。它由 LocalDateTime + ZoneId 构成,比如
ZonedDateTime.now(ZoneId.of("Asia/Shanghai"))。
用“加减查改”四步法练熟操作
每个类都遵循统一模式,练熟这四类动作,其他类举一反三:
-
加:用
plusDays()、plusHours()、plus(1, ChronUnit.WEEKS)—— 返回新对象,原对象不变。 -
减:用
minusMonths()、minus(30, ChronUnit.MINUTES)—— 同样返回新实例。 -
查:用
getDayOfMonth()、getHour()、getDayOfWeek()—— 获取字段值,返回 int 或枚举(如 DayOfWeek.MONDAY)。 -
改:用
withYear(2027)、withHour(14)、with(TemporalAdjusters.next(DayOfWeek.FRIDAY))—— “替换某一部分”,不是 set,仍是不可变语义。
格式化与解析只用 DateTimeFormatter
告别 SimpleDateFormat(线程不安全、难调试)。统一用 DateTimeFormatter:
- 预设格式:直接用
DateTimeFormatter.ISO_LOCAL_DATE_TIME或DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - 格式化输出:
localDateTime.format(formatter); - 解析字符串:
LocalDateTime.parse("2026-10-13 14:20:00", formatter)—— 注意:必须严格匹配,否则抛DateTimeParseException。
避开老 API 的惯性陷阱
很多卡点其实来自旧习惯:
- 不再调用
new Date().getTime()获取时间戳,改用Instant.now().toEpochMilli(); - 不再用
Calendar.getInstance().add(Calendar.DAY_OF_MONTH, 5),改用LocalDateTime.now().plusDays(5); - 不再手动处理月份从 0 开始(Calendar.MONTH=0 表示 1 月),LocalDate/LocalDateTime 的 month 都是 1~12;
- 遇到时区转换,不用自己加减小时数,用
zonedDateTime.withZoneSameInstant(ZoneId.of("UTC"))或withZoneSameLocal()。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











