LocalDateTime 是 Java 8+ 处理「本地日期 + 时间」(无时区)的核心类,常用方法可分为 创建对象、获取字段、修改时间、时间比较、格式转换 5 大类,结合你之前的「取水代码」场景,我会用通俗的例子和实际用途讲解,新手易理解。
一、创建 LocalDateTime 对象(最基础)
用于生成时间实例,是所有操作的前提,你代码中用的是 of() 方法:
表格
| 方法 | 作用 | 示例(对应你代码的取水时间) |
|---|---|---|
LocalDateTime.of(年,月,日,时,分,秒) | 指定具体时间创建(最常用) | LocalDateTime.of(2026,3,22,10,0,0) → 2026-03-22 10:00:00 |
LocalDateTime.now() | 获取当前系统的本地时间 | LocalDateTime.now() → 比如 2026-03-22 15:30:20 |
LocalDateTime.parse(字符串) | 解析固定格式的字符串为时间(需符合 yyyy-MM-ddTHH:mm:ss) | LocalDateTime.parse("2026-03-22T10:00:00") |
你代码中的用法:读取输入的年、月、日、时、分、秒,组装成取水时间:
LocalDateTime time = LocalDateTime.of(year, month, day, hour, minute, second);
二、获取时间字段(提取年 / 月 / 日 / 时等)
用于从时间对象中提取具体字段,比如判断取水时间是几点、几号:
表格
| 方法 | 作用 | 示例(time=2026-03-22 10:00:00) |
|---|---|---|
getYear() | 获取年份 | time.getYear() → 2026 |
getMonthValue() | 获取月份(1-12) | time.getMonthValue() → 3 |
getDayOfMonth() | 获取日期(1-31) | time.getDayOfMonth() → 22 |
getHour() | 获取小时(0-23) | time.getHour() → 10 |
getMinute() | 获取分钟(0-59) | time.getMinute() → 0 |
getSecond() | 获取秒(0-59) | time.getSecond() → 0 |
三、修改时间(加减 / 替换字段)
核心用于计算「封禁截止时间」(你代码中用 plusHours()),注意:LocalDateTime 是不可变的,所有修改方法都会返回新对象,原对象不变。
表格
| 方法 | 作用 | 示例(time=2026-03-22 10:00:00) |
|---|---|---|
plusHours(n) | 加 n 小时(核心) | time.plusHours(6) → 2026-03-22 16:00:00(封禁 6 小时) |
plusMinutes(n) | 加 n 分钟 | time.plusMinutes(30) → 2026-03-22 10:30:00 |
plusDays(n) | 加 n 天 | time.plusDays(1) → 2026-03-23 10:00:00 |
minusHours(n) | 减 n 小时 | time.minusHours(2) → 2026-03-22 08:00:00 |
withHour(n) | 替换小时(直接改) | time.withHour(14) → 2026-03-22 14:00:00 |
withDayOfMonth(n) | 替换日期 | time.withDayOfMonth(25) → 2026-03-25 10:00:00 |
你代码中的用法:计算水井封禁截止时间(取水时间 + 6 小时 / 1 小时):
banUntil = time.plusHours(6); // 公共井封禁6小时
banUntil = time.plusHours(1); // 私人井封禁1小时
四、时间比较(核心用于判断封禁期)
用于判断「当前取水时间是否在封禁截止时间之前」,返回 boolean(true/false):
表格
| 方法 | 作用 | 示例(time1=10:00, time2=16:00) |
|---|---|---|
isBefore(目标时间) | 判断当前时间是否在目标时间之前(核心) | time1.isBefore(time2) → true(10 点在 16 点前) |
isAfter(目标时间) | 判断当前时间是否在目标时间之后 | time1.isAfter(time2) → false |
isEqual(目标时间) | 判断两个时间是否完全相同 | time1.isEqual(time2) → false |
你代码中的核心逻辑:判断取水时间是否在封禁期内(banUntil 是封禁截止时间):
if (banUntil != null && time.isBefore(banUntil)) {
return null; // 还在封禁期,取不到水
}
五、格式转换(时间↔字符串)
用于将时间对象转为易读的字符串(比如日志输出),需配合 DateTimeFormatter:
import java.time.format.DateTimeFormatter;
public class Demo {
public static void main(String[] args) {
LocalDateTime time = LocalDateTime.of(2026,3,22,10,0,0);
// 1. 时间 → 字符串(自定义格式)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String timeStr = time.format(formatter);
System.out.println(timeStr); // 输出:2026-03-22 10:00:00
// 2. 字符串 → 时间(格式必须匹配)
LocalDateTime time2 = LocalDateTime.parse("2026-03-22 10:00:00", formatter);
}
}
总结(核心要点)
- 创建:优先用
of(年,月,日,时,分,秒)(指定时间)、now()(当前时间); - 修改:
plusHours(n)(加小时)是你代码的核心,用于计算封禁时间; - 比较:
isBefore()是判断封禁期的关键,记住「当前时间.isBefore (截止时间) → 还在封禁期」; - 特性:LocalDateTime 不可变,修改后要接收新对象(比如
banUntil = time.plusHours(6))。
这些是 LocalDateTime 80% 场景会用到的方法,尤其是你的取水代码中,只用到了 of()、plusHours()、isBefore() 三个核心方法,掌握这三个就能理解代码中的时间逻辑。
988

被折叠的 条评论
为什么被折叠?



