Java 8 的 java.time API 是 Calendar 和 Date 的现代化替代方案,核心包括 LocalDate/LocalTime/LocalDateTime 处理无时区日期时间、ZonedDateTime/OffsetDateTime 处理时区、Instant 表示绝对时间戳、DateTimeFormatter 替代线程不安全的 SimpleDateFormat。

Java 8 引入的 java.time API(JSR-310)是 Calendar 和 Date 的现代化替代方案,设计更清晰、线程安全、语义明确。直接用它替换过时的 Calendar,核心在于理解其类型分工和不可变性原则。
用 LocalDate / LocalTime / LocalDateTime 替代“无时区纯日期/时间”操作
Calendar 常被误用于仅处理日期(如“2024-05-20”)或时间(如“14:30”),但它实际绑定时区且状态可变,易出错。
-
替换 get(Calendar.YEAR) / set(Calendar.MONTH) 等:用
LocalDate—— 它只关心年月日,不涉及时区和毫秒精度。
例:获取今天、加3天、格式化:LocalDate today = LocalDate.now();<br>LocalDate after3 = today.plusDays(3);<br>String s = today.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); -
只处理时间(如营业时段):用
LocalTime,支持 plusHours()、isBefore() 等,比 Calendar 的 HOUR_OF_DAY 操作直观得多。 -
同时需要日期+时间(无时区上下文,如数据库 DATETIME 字段):用
LocalDateTime。注意:它不是“当前时刻”,而是“本地系统时钟下的日期时间快照”,不包含时区信息。
用 ZonedDateTime / OffsetDateTime 处理真实世界的时间(含时区)
Calendar 的时区处理依赖 setTimeZone(),但容易遗漏或覆盖;而 java.time 把时区作为类型的一部分,强制显式表达。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
-
要表示“北京时间2024-05-20 10:00”这个带时区的完整时刻:用
ZonedDateTime.of(LocalDateTime, ZoneId)或直接ZonedDateTime.now(ZoneId.of("Asia/Shanghai"))。 -
与服务器通信常用带偏移量的时间(如 ISO 8601 格式 "2024-05-20T10:00:00+08:00"):用
OffsetDateTime,比 Calendar 解析 + set() 组合更可靠。 -
跨时区转换(如用户在纽约下单,需转为 UTC 存储):
ZonedDateTime nyTime = ZonedDateTime.now(ZoneId.of("America/New_York"));<br>ZonedDateTime utcTime = nyTime.withZoneSameInstant(ZoneId.of("UTC"));
用 Instant 替代 System.currentTimeMillis() 和 “绝对时间戳”场景
Calendar.getTime().getTime() 或 new Date().getTime() 返回 long 毫秒值,本质是 UTC 时间轴上的一个点。这正是 Instant 的定位 —— 不可变、线程安全、零时区。
立即学习“Java免费学习笔记(深入)”;
-
记录日志时间、计算耗时、数据库 TIMESTAMP WITH TIME ZONE 字段:优先用
Instant.now()。 -
与旧代码交互时转换:
Instant.from(calendar.toInstant())(推荐)
Instant.ofEpochMilli(date.getTime())
反向也简单:Date.from(instant)、calendar.setTime(Date.from(instant))。
用 DateTimeFormatter 替代 SimpleDateFormat(线程安全!)
SimpleDateFormat 非线程安全,常因共享实例引发诡异 bug;DateTimeFormatter 是不可变且线程安全的。
-
预定义格式直接用静态常量:如
DateTimeFormatter.ISO_LOCAL_DATE、DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")。 -
避免每次 new Formatter:把它声明为
static final字段复用。 -
解析时严格校验:默认严格模式,遇到非法输入(如 2024-02-30)直接抛
DateTimeParseException,比 Calendar 的静默错误更健壮。

















