日期时间 API:LocalDate、LocalTime、LocalDateTime | JavaSE
日期时间 API:LocalDate、LocalTime、LocalDateTime
一、学习目标
完成本章后,你应该能够:
- 区分
LocalDate、LocalTime、LocalDateTime分别表示什么数据。 - 使用
now()获取当前本地日期、时间和日期时间。 - 使用
of()创建指定日期和时间。 - 使用
getYear()、getMonthValue()、getDayOfMonth()、getHour()等方法获取时间字段。 - 使用
plusXxx()、minusXxx()完成日期时间加减运算。 - 使用
isBefore()、isAfter()、equals()比较日期时间。 - 使用
DateTimeFormatter完成日期时间格式化和解析。 - 理解 Java 8+
java.timeAPI 的不可变设计。 - 准确解释
LocalDateTime为什么不等于“带时区的绝对时间”。 - 能够根据生日、预约、课程时间、订单时间等业务场景选择合适的时间类型。
二、核心知识
2.1 程序为什么需要日期时间 API
实际开发中存在大量时间数据:
用户生日
注册日期
订单创建时间
文章发布时间
会议开始时间
课程时间
考试日期
会员到期时间
日志生成时间
任务截止时间
这些数据表面上都是:
年
月
日
时
分
秒
但它们的业务语义不同。
例如:
生日
→ 只关心日期
每天 08:30 上课
→ 只关心时间
2026-09-02 18:30 提交作业
→ 日期 + 时间
因此 Java 没有让一个类强行承担所有场景,而是提供不同的日期时间类型。
2.2 java.time
现代 Java 日期时间 API 主要位于:
java.time
包中。
其中本章最核心的是:
LocalDate
LocalTime
LocalDateTime
可以理解为:
LocalDate
→ 日期
LocalTime
→ 时间
LocalDateTime
→ 日期 + 时间
2.3 LocalDate
LocalDate 表示:
不包含具体时刻和时区的日期。
典型数据:
2026-09-02
它主要包含:
年
月
日
适合:
生日
入学日期
考试日期
节假日
账单日期
2.4 LocalTime
LocalTime 表示:
一天中的本地时间,不包含日期和时区。
例如:
18:30:15
它主要包含:
时
分
秒
纳秒
适合:
每天 08:00 上课
商店 22:00 关门
闹钟时间
固定作息时间
2.5 LocalDateTime
LocalDateTime 表示:
日期与本地时间的组合。
例如:
2026-09-02T18:30:15
可以理解为:
LocalDate
+
LocalTime
=
LocalDateTime
适合表示:
本地预约时间
文章编辑时间
本地课程时间
本地业务时间
2.6 LocalDateTime 有时区吗
没有。
这是必须掌握的核心知识。
例如:
2026-09-02 18:30
如果只给这个时间,你其实不知道它表示:
北京时间?
纽约时间?
伦敦时间?
东京时间?
因此:
LocalDateTime
描述的是:
某个本地日历日期和墙上时钟显示的时间。
它本身不包含:
ZoneId
UTC Offset
所以:
LocalDateTime
≠
世界时间线上的唯一瞬间
如果业务真正需要:
跨时区
UTC
全球统一时间点
通常还需要学习:
ZoneId
ZonedDateTime
OffsetDateTime
Instant
这些属于本章的边界扩展,不是当前主线。
2.7 三个类的关系
可以建立:
java.time
│
┌───────┼───────────┐
│ │ │
LocalDate LocalTime LocalDateTime
│ │ │
日期 时间 日期 + 时间
│ │ │
年月日 时分秒 年月日时分秒
选择标准:
只需要日期
→ LocalDate
只需要一天中的时间
→ LocalTime
需要日期 + 时间
→ LocalDateTime
三、使用方法
3.1 获取当前日期
import java.time.LocalDate;
public class DateDemo {
public static void main(String[] args) {
LocalDate today =
LocalDate.now();
System.out.println(today);
}
}
实际输出取决于程序运行时的日期,例如:
2026-09-02
3.2 获取当前时间
import java.time.LocalTime;
public class TimeDemo {
public static void main(String[] args) {
LocalTime now =
LocalTime.now();
System.out.println(now);
}
}
实际结果取决于程序运行时,例如:
18:30:45.123456
3.3 获取当前日期时间
import java.time.LocalDateTime;
public class DateTimeDemo {
public static void main(String[] args) {
LocalDateTime now =
LocalDateTime.now();
System.out.println(now);
}
}
结果类似:
2026-09-02T18:30:45.123
中间的:
T
是 ISO-8601 日期时间文本格式中的日期和时间分隔符。
3.4 now() 中的“当前”从哪里来
例如:
LocalDate.now();
以及:
LocalDateTime.now();
会使用系统时钟。
没有显式指定时区的 now():
会按照系统默认时区获取对应的本地日期时间。
因此不同服务器如果配置了不同默认时区:
LocalDateTime.now()
得到的本地时间可能不同。
这也是为什么:
“本地日期时间”和“全球唯一时间点”不能混为一谈。
3.5 使用 of() 创建指定日期
不是所有业务都需要“现在”。
例如用户生日:
2003-10-08
可以:
LocalDate birthday =
LocalDate.of(
2003,
10,
8
);
得到:
2003-10-08
3.6 创建指定 LocalTime
例如每天:
08:30
上课:
LocalTime classTime =
LocalTime.of(
8,
30
);
还可以指定秒:
LocalTime time =
LocalTime.of(
8,
30,
15
);
3.7 创建指定 LocalDateTime
例如:
2026-10-01 09:30:00
可以:
LocalDateTime meeting =
LocalDateTime.of(
2026,
10,
1,
9,
30
);
也可以先创建:
LocalDate date =
LocalDate.of(2026, 10, 1);
LocalTime time =
LocalTime.of(9, 30);
然后:
LocalDateTime meeting =
LocalDateTime.of(date, time);
这进一步体现了:
LocalDateTime
=
LocalDate
+
LocalTime
3.8 获取 LocalDate 字段
例如:
LocalDate date =
LocalDate.of(
2026,
9,
2
);
获取年份:
int year =
date.getYear();
获取月份:
int month =
date.getMonthValue();
获取月中的第几天:
int day =
date.getDayOfMonth();
获取一年中的第几天:
int dayOfYear =
date.getDayOfYear();
获取星期:
DayOfWeek dayOfWeek =
date.getDayOfWeek();
3.9 getMonth() 与 getMonthValue()
例如:
LocalDate date =
LocalDate.of(
2026,
9,
2
);
调用:
date.getMonth();
得到的是:
Month
枚举对象,例如:
SEPTEMBER
而:
date.getMonthValue();
得到:
9
因此:
需要数字月份
→ getMonthValue()
需要 Month 枚举语义
→ getMonth()
3.10 获取 LocalTime 字段
例如:
LocalTime time =
LocalTime.of(
18,
35,
20
);
可以:
System.out.println(
time.getHour()
);
System.out.println(
time.getMinute()
);
System.out.println(
time.getSecond()
);
分别获得:
18
35
20
3.11 获取 LocalDateTime 字段
LocalDateTime 同时包含日期和时间,所以可以:
LocalDateTime now =
LocalDateTime.now();
System.out.println(now.getYear());
System.out.println(now.getMonthValue());
System.out.println(now.getDayOfMonth());
System.out.println(now.getHour());
System.out.println(now.getMinute());
System.out.println(now.getSecond());
原始教学案例中也重点使用了:
now.getYear();
now.getDayOfYear();
来读取日期时间字段。
3.12 plusXxx():时间增加
例如:
LocalDate date =
LocalDate.of(
2026,
9,
2
);
七天后:
LocalDate nextWeek =
date.plusDays(7);
一个月后:
LocalDate nextMonth =
date.plusMonths(1);
一年后:
LocalDate nextYear =
date.plusYears(1);
3.13 LocalDateTime 时间加法
例如:
LocalDateTime now =
LocalDateTime.now();
60 秒后:
LocalDateTime later =
now.plusSeconds(60);
这正是原始教学文档中的核心时间 API 示例。
还可以:
now.plusMinutes(10);
now.plusHours(2);
now.plusDays(3);
now.plusMonths(1);
now.plusYears(1);
3.14 plusXxx() 会不会修改原对象
不会。
例如:
LocalDateTime now =
LocalDateTime.now();
LocalDateTime later =
now.plusSeconds(60);
有:
now
→ 原来的时间
later
→ 60 秒后的新时间
原始:
now
本身没有被改变。
这和:
String
非常类似。
LocalDate、LocalTime、LocalDateTime 都是:
不可变对象(Immutable Object)。
因此:
now.plusDays(1);
如果你完全不接收返回值:
System.out.println(now);
仍然得到原来的日期时间。
3.15 minusXxx():时间减少
例如:
LocalDate today =
LocalDate.now();
LocalDate yesterday =
today.minusDays(1);
LocalDate lastWeek =
today.minusWeeks(1);
LocalDate lastMonth =
today.minusMonths(1);
LocalDateTime 同样支持:
now.minusSeconds(30);
now.minusMinutes(10);
now.minusHours(2);
now.minusDays(7);
可以形成:
plusXxx
→ 向未来
minusXxx
→ 向过去
的直观认识。
3.16 withXxx():修改某个时间字段
因为对象不可变,所以这里的“修改”实际上是:
根据原对象创建一个部分字段变化的新对象。
例如:
LocalDate date =
LocalDate.of(
2026,
9,
2
);
LocalDate newDate =
date.withYear(2030);
得到:
date
→ 2026-09-02
newDate
→ 2030-09-02
还有:
withMonth()
withDayOfMonth()
withHour()
withMinute()
withSecond()
等类似方法。
3.17 isBefore():判断是否更早
例如:
LocalDate a =
LocalDate.of(2026, 9, 1);
LocalDate b =
LocalDate.of(2026, 9, 10);
判断:
System.out.println(
a.isBefore(b)
);
结果:
true
3.18 isAfter():判断是否更晚
System.out.println(
b.isAfter(a)
);
结果:
true
这在:
截止日期判断
预约时间判断
会员到期判断
时间范围校验
中非常常见。
3.19 equals():时间值是否相同
例如:
LocalDate a =
LocalDate.of(2026, 9, 2);
LocalDate b =
LocalDate.of(2026, 9, 2);
应该使用:
a.equals(b)
比较日期值。
现代日期时间类型属于值对象,不应该通过对象身份:
==
来表达业务上的日期时间相等判断。
3.20 DateTimeFormatter 是什么
程序内部常用:
LocalDate
LocalTime
LocalDateTime
保存和运算时间。
但展示给用户时,我们可能希望:
2026年09月02日 18:30:00
而不是:
2026-09-02T18:30
这就需要:
DateTimeFormatter
即:
日期时间格式化器。
3.21 创建 DateTimeFormatter
例如:
import java.time.format.DateTimeFormatter;
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern(
"yyyy-MM-dd HH:mm:ss"
);
其中:
yyyy
→ 年
MM
→ 月
dd
→ 日
HH
→ 24 小时制小时
mm
→ 分钟
ss
→ 秒
注意:
MM
和:
mm
不是一回事。
MM
→ 月
mm
→ 分
大小写非常重要。
3.22 格式化 LocalDateTime
例如:
LocalDateTime now =
LocalDateTime.now();
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern(
"yyyy-MM-dd HH:mm:ss"
);
String result =
now.format(formatter);
System.out.println(result);
也可以像原始教学代码那样:
String result =
formatter.format(now);
两种思路都可以理解为:
LocalDateTime
+
DateTimeFormatter
↓
String
即:
时间对象 → 文本。
3.23 格式化中文日期
例如:
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern(
"yyyy年MM月dd日 HH:mm:ss"
);
输出可能类似:
2026年09月02日 18:30:15
3.24 parse():字符串解析成时间对象
格式化是:
时间对象
→ String
解析则相反:
String
→ 时间对象
例如:
String text =
"2026-09-02T18:30:00";
LocalDateTime time =
LocalDateTime.parse(text);
因为这个文本符合标准的:
ISO_LOCAL_DATE_TIME
格式。
3.25 使用自定义格式解析
假设用户输入:
2026-09-02 18:30:00
不是默认带 T 的形式。
可以:
String text =
"2026-09-02 18:30:00";
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern(
"yyyy-MM-dd HH:mm:ss"
);
LocalDateTime time =
LocalDateTime.parse(
text,
formatter
);
于是:
"2026-09-02 18:30:00"
↓
DateTimeFormatter
↓
LocalDateTime
3.26 时间格式化与解析关系
必须掌握:
LocalDateTime
│
│ format
↓
String
String
│
│ parse
↓
LocalDateTime
即:
format
→ 对外展示
parse
→ 接收文本转换成程序可操作的日期时间对象
3.27 完整基础示例
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class JavaTimeDemo {
public static void main(String[] args) {
LocalDate date =
LocalDate.now();
LocalTime time =
LocalTime.now();
LocalDateTime dateTime =
LocalDateTime.now();
System.out.println(date);
System.out.println(time);
System.out.println(dateTime);
LocalDate birthday =
LocalDate.of(
2003,
10,
8
);
System.out.println(birthday);
LocalDateTime tomorrow =
dateTime.plusDays(1);
System.out.println(tomorrow);
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern(
"yyyy-MM-dd HH:mm:ss"
);
String text =
dateTime.format(formatter);
System.out.println(text);
}
}
四、原理与进阶
4.1 为什么现代日期时间类设计成不可变对象
假设多个模块都拿到同一个日期时间值。
如果其中一个模块能够偷偷修改这个对象内部状态,很容易造成:
预约时间突然变化
订单时间被意外修改
多线程共享产生状态冲突
不可变设计意味着:
LocalDateTime tomorrow =
today.plusDays(1);
不是:
把 today 自己改成明天
而是:
根据 today 得到一个新的明天对象
这使日期时间对象:
- 更容易推理
- 更适合共享
- 线程安全性更好
- 不容易产生隐式状态变化
4.2 与 String 的不可变性联系
你现在已经学过:
String
不可变。
现在又看到:
LocalDate
LocalTime
LocalDateTime
不可变。
它们具有非常相似的调用模式:
String s = "Java";
String newS = s.replace(
"Java",
"Python"
);
与:
LocalDate date =
LocalDate.now();
LocalDate tomorrow =
date.plusDays(1);
共同特点:
原对象不改变
+
操作返回新对象
这是 Java API 中非常重要的一种设计模式。
4.3 LocalDateTime 为什么不能表示全球唯一时间点
例如:
2026-09-02 12:00
在:
北京
和:
洛杉矶
不是同一个瞬间。
但是:
LocalDateTime
只保存:
2026
09
02
12
00
没有保存:
Asia/Shanghai
America/Los_Angeles
UTC+08:00
UTC-07:00
因此它无法独立映射到世界时间线上的唯一位置。
这就是:
Local
这个词真正值得理解的地方。
4.4 LocalDate 与业务语义
有些数据本质上就不应该带时区。
例如:
生日:2003-10-08
如果把生日强行设计为一个 UTC 时间点:
2003-10-08T00:00:00Z
反而可能因为时区转换变成另一天。
因此:
不是所有时间数据都应该使用 Instant。
选择正确的时间模型,比单纯会调用 API 更重要。
4.5 DateTimeFormatter 通常可以复用
DateTimeFormatter 是不可变并且线程安全的格式化器。
如果某种格式被大量重复使用,例如:
yyyy-MM-dd HH:mm:ss
实际工程中通常可以将对应 formatter 复用,而不是每次业务调用都重新创建。
例如:
private static final
DateTimeFormatter DATE_TIME_FORMATTER =
DateTimeFormatter.ofPattern(
"yyyy-MM-dd HH:mm:ss"
);
这也是:
不可变对象
+
工具常量
在工程中的一种典型应用。
4.6 Period 与 Duration:时间间隔的进一步工具
如果以后需要计算两个日期之间:
相差几年
几个月
几天
可以进一步学习:
Period
如果需要计算两个时间点之间:
相差多少小时
分钟
秒
可以进一步学习:
Duration
例如:
LocalDate
→ 更常与 Period 配合
LocalDateTime / LocalTime
→ 可与 Duration 等时间量概念配合
本章暂时建立认识,不展开完整 API。
五、实践应用
5.1 判断任务是否过期
假设:
LocalDate deadline =
LocalDate.of(
2026,
9,
10
);
LocalDate today =
LocalDate.now();
可以:
if (today.isAfter(deadline)) {
System.out.println("任务已过期");
}
这个业务逻辑非常自然:
今天
>
截止日期
↓
过期
5.2 计算课程日期
例如当前课程日期:
LocalDate current =
LocalDate.of(
2026,
9,
2
);
七天后的课程:
LocalDate next =
current.plusWeeks(1);
不需要自己处理:
月底
跨月
跨年
闰年
等大量细节。
这是日期时间 API 相比:
自己用 int year/month/day 运算
的重要价值。
5.3 预约时间展示
程序内部:
LocalDateTime appointment =
LocalDateTime.of(
2026,
9,
10,
14,
30
);
页面希望显示:
2026年09月10日 14:30
可以:
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern(
"yyyy年MM月dd日 HH:mm"
);
String text =
appointment.format(formatter);
这体现:
内部时间模型
↓
格式化
↓
用户界面文本
5.4 接收用户预约时间
用户输入:
2026-09-10 14:30
程序需要进一步做时间比较。
因此不能一直把它当:
String
而应该:
String
↓ parse
LocalDateTime
↓
比较 / 加减 / 校验
这就是:
数据表示与业务计算类型分离。
六、常见问题
6.1 LocalDateTime 是不是“当前时间”
不是。
LocalDateTime 是一种:
类型
而:
LocalDateTime.now()
才是:
创建当前本地日期时间的一种方式。
也可以:
LocalDateTime.of(...)
创建任意合法日期时间。
6.2 LocalDateTime 有没有时区
没有。
这是本章最重要的概念之一。
如果需要真正的全球时间点或跨时区处理,要进一步考虑:
Instant
ZonedDateTime
OffsetDateTime
ZoneId
6.3 plusDays() 为什么原对象没有变化
因为:
LocalDate
LocalTime
LocalDateTime
是不可变对象。
错误:
LocalDate date =
LocalDate.now();
date.plusDays(1);
System.out.println(date);
这里:
date
仍是原日期。
需要:
LocalDate tomorrow =
date.plusDays(1);
或者:
date =
date.plusDays(1);
6.4 yyyy-MM-dd 中 MM 和 mm 有什么区别
MM
→ 月份
mm
→ 分钟
日期时间 pattern 对大小写敏感。
类似地:
HH
表示 24 小时制小时。
所以格式模式不能随便改变大小写。
6.5 LocalDate 能不能获取小时
不能。
因为:
LocalDate
只表示:
日期
不包含:
时间
同理:
LocalTime
不能直接提供:
年份
月份
日期
选择正确的类型本身就是 API 设计的一部分。
6.6 of() 创建 2 月 30 日会怎样
例如:
LocalDate.of(
2026,
2,
30
);
并不是一个合法日期。
Java 日期时间 API 会检查:
日期字段是否在合法范围内
+
这个日期在实际日历中是否成立
非法值会导致日期时间异常。
因此:
of()不是简单地把三个 int 塞进对象。
它维护真正的日期规则。
6.7 DateTimeFormatter 格式不匹配会怎样
例如 formatter 要求:
yyyy-MM-dd HH:mm:ss
但输入:
2026/09/02 18:30
格式并不一致。
解析就可能失败。
因此:
用户输入格式
必须与:
DateTimeFormatter
规则匹配。
6.8 Date 与 LocalDate 是不是同一个东西
不是。
老 Java API 中存在:
java.util.Date
以及:
SimpleDateFormat
原始教学文档也把它们作为 JDK 8 以前方案进行了介绍。
现代代码优先掌握:
java.time
体系:
LocalDate
LocalTime
LocalDateTime
DateTimeFormatter
老项目维护时仍然可能遇到:
Date
SimpleDateFormat
但本教程的主教学方案采用现代 Java API。
6.9 为什么不能用字符串直接比较日期时间
例如:
String a = "2026-9-2";
String b = "2026-10-1";
直接按照字符串比较规则进行业务时间判断容易产生错误和隐含假设。
业务时间应该优先解析为:
LocalDate
然后:
aDate.isBefore(bDate);
日期时间 API 才真正理解:
年份
月份
日期
日历规则
七、练习与验收
7.1 知识问答
LocalDate表示什么?LocalTime表示什么?LocalDateTime表示什么?- 三者是否自带时区?
LocalDateTime为什么不能单独表示全球时间线上的唯一瞬间?now()与of()分别解决什么问题?getMonth()与getMonthValue()有什么区别?plusDays()是否修改原对象?- 为什么
LocalDate等类型采用不可变设计? plusXxx()与minusXxx()分别解决什么问题?isBefore()与isAfter()如何使用?DateTimeFormatter的作用是什么?- format 与 parse 的数据转换方向分别是什么?
MM与mm有什么区别?LocalDateTime与Instant在时间语义上最核心的区别是什么?- 什么业务更适合 LocalDate,而不应该随便使用带时间点的类型?
- Java 8+ 日期时间 API 相比旧 Date/SimpleDateFormat 体系有什么设计优势?
7.2 代码阅读
不运行程序,分析代码:
import java.time.LocalDate;
public class DateRead01 {
public static void main(String[] args) {
LocalDate date =
LocalDate.of(
2026,
9,
2
);
LocalDate next =
date.plusDays(30);
System.out.println(date);
System.out.println(next);
}
}
回答:
date会不会改变?next与date是否是同一个日期值?- 代码体现了什么 API 设计思想?
继续阅读:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateRead02 {
public static void main(String[] args) {
LocalDateTime time =
LocalDateTime.of(
2026,
10,
1,
8,
30
);
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern(
"yyyy/MM/dd HH:mm"
);
System.out.println(
time.format(formatter)
);
}
}
在不运行的情况下写出输出格式,并逐段解释 pattern。
7.3 手写代码
任务一:生日对象
使用:
LocalDate
保存自己的生日。
输出:
- 年
- 月
- 日
- 星期几
- 一年中的第几天
任务二:课程安排
创建:
2026-09-07 08:30
的课程时间。
分别计算:
1 小时后
7 天后
1 个月后
要求保留原对象并输出所有结果。
任务三:时间格式化
获取当前 LocalDateTime。
分别输出成:
yyyy-MM-dd HH:mm:ss
yyyy/MM/dd HH:mm
yyyy年MM月dd日 HH时mm分
三种格式。
任务四:时间解析
给定:
2026-12-31 23:30:00
解析为:
LocalDateTime
然后计算:
90 分钟后
的日期时间。
7.4 Debug
下面代码存在设计问题:
LocalDate date =
LocalDate.now();
date.plusDays(7);
System.out.println(date);
要求:
- 说明程序为什么没有得到“7天后”。
- 说明是否属于语法错误。
- 修复代码。
- 解释不可变对象的调用规则。
继续 Debug:
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern(
"yyyy-mm-dd HH:MM:ss"
);
要求:
- 找出月份和分钟相关的问题。
- 分析为什么大小写不能随便交换。
- 写出正确格式。
继续:
LocalDate date =
LocalDate.of(
2026,
2,
30
);
要求:
- 判断问题发生在编译阶段还是运行阶段。
- 分析为什么这个日期非法。
- 设计合理的用户输入校验思路。
7.5 综合训练
设计一个“任务截止时间管理器”。
程序保存:
任务名称
创建时间
截止时间
要求:
- 使用
LocalDateTime表示时间。 - 获取当前时间。
- 创建指定截止时间。
- 判断任务是否已经过期。
- 判断截止时间是否晚于创建时间。
- 输出格式为:
yyyy-MM-dd HH:mm:ss
- 计算一个“延期三天”的新截止时间。
- 保证原截止时间对象不被修改。
- 说明为什么当前案例使用 LocalDateTime,而不是 LocalDate 或 LocalTime。
7.6 本章验收
能够闭卷画出:
日期时间 API
│
┌─────────┼─────────┐
│ │ │
LocalDate LocalTime LocalDateTime
日期 时间 日期+时间
能够闭卷写出:
LocalDate.now()
LocalDate.of()
LocalTime.now()
LocalTime.of()
LocalDateTime.now()
LocalDateTime.of()
能够使用:
getXxx
plusXxx
minusXxx
withXxx
isBefore
isAfter
equals
能够完成:
时间对象
↓
DateTimeFormatter
↓
String
以及:
String
↓
DateTimeFormatter
↓
时间对象
并能准确解释:
LocalDateTime 不带时区
+
java.time 日期时间对象不可变
+
now() 默认依赖系统时钟和默认时区
则本章核心能力基本达标。