425. Java 日期时间 API - 处理日期 + 时间的类

0 阅读2分钟

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:日期 + 时间的组合,但仍然没有时区。
  • 如果要处理 跨时区 的场景(比如航班、跨国会议),那就需要用 ZonedDateTimeOffsetDateTime