425. Java 日期时间 API - 处理日期 + 时间的类
在 Java 8 的 Date-Time API 中,有两类核心的日期时间对象:
- LocalTime —— 只关注时间(几点几分几秒),不含日期、不含时区。
- LocalDateTime —— 同时包含日期和时间,但依然不含时区。
✅ LocalTime —— 专注于“时间点”
- 表示:小时、分钟、秒、纳秒
- 不包含:日期和时区
- 应用场景:适合描述一天中的某个时间点,比如:
- 电影院的放映时间
- 商店的开门/关门时间
- 课堂上点名时间
🔹 示例 1:获取当前时间
LocalTime now = LocalTime.now();
System.out.println("当前时间: " + now);
👉 输出示例:
当前时间: 11:32:45.123
🔹 示例 2:制作一个“数字时钟”
for (int i = 0; i < 5; i++) {
LocalTime thisSec = LocalTime.now();
System.out.printf("Time: %02d:%02d:%02d%n",
thisSec.getHour(), thisSec.getMinute(), thisSec.getSecond());
Thread.sleep(1000);
}
👉 输出示例:
Time: 11:32:45
Time: 11:32:46
Time: 11:32:47
...
💡 很适合拿来做教学小实验,让学员看到 LocalTime 每秒更新。
🔹 示例 3:计算时间差
LocalTime start = LocalTime.of(9, 0); // 上午 9:00
LocalTime end = LocalTime.of(17, 30); // 下午 5:30
long hours = Duration.between(start, end).toHours();
System.out.println("工作时长: " + hours + " 小时");
👉 输出:
工作时长: 8 小时
✅ LocalDateTime —— 日期 + 时间
- 表示:年月日 + 时分秒 + 纳秒
- 不包含:时区
- 应用场景:适合描述一个具体的本地事件,比如:
- 某次会议在 2025-09-20 14:00 开始
- 某人生日是 1994-04-15 上午 11:30
- 某个系统日志记录的时间戳
🔹 示例 1:获取当前时间
System.out.printf("now: %s%n", LocalDateTime.now());
👉 输出示例:
now: 2025-09-15T11:32:45.678
🔹 示例 2:创建指定的日期时间
LocalDateTime birthday = LocalDateTime.of(1994, Month.APRIL, 15, 11, 30);
System.out.printf("Birthday: %s%n", birthday);
👉 输出:
Birthday: 1994-04-15T11:30
🔹 示例 3:从 Instant 转换
System.out.printf("now (from Instant): %s%n",
LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault()));
👉 输出示例:
now (from Instant): 2025-09-15T11:32:46.123
💡 Instant 表示 机器时间(自 1970-01-01 起的纳秒时间),而 LocalDateTime 更贴近 人类时间。
🔹 示例 4:时间加减运算
System.out.printf("6 months from now: %s%n",
LocalDateTime.now().plusMonths(6));
System.out.printf("6 months ago: %s%n",
LocalDateTime.now().minusMonths(6));
👉 输出示例:
6 months from now: 2026-03-15T11:32:46.789
6 months ago: 2025-03-15T11:32:46.790
💡 很适合用于:
- 会议日程推算
- 贷款/保险到期日计算
- 定期提醒
🎯 小结
- LocalTime:只关注时间点(几点几分几秒),没有日期和时区。
- LocalDateTime:日期 + 时间的组合,但仍然没有时区。
- 如果要处理 跨时区 的场景(比如航班、跨国会议),那就需要用
ZonedDateTime或OffsetDateTime。