LocalDateTime 不带时区、不表示时刻,仅表示本地年月日+时分秒;适用于订单时间、日志戳等本地场景,不可用于跨时区比较;创建方式包括 now()、of()、parse();所有修改操作返回新实例;格式化需用 DateTimeFormatter;转 Instant 必须显式指定时区。

Java 中使用 LocalDateTime 处理日期和时间,关键在于它**不带时区、不表示时刻,只表示“本地”的年月日+时分秒**。适合记录业务发生时间(如订单创建时间)、日志时间戳(本地系统视角),但不适合跨时区比较或存储为绝对时间。
创建 LocalDateTime 实例
有多种常用方式,按需选择:
-
获取当前系统本地时间:
LocalDateTime.now()—— 基于 JVM 默认时区的系统时钟 -
指定年月日时分秒构造:
LocalDateTime.of(2024, 10, 5, 14, 30, 45)或LocalDateTime.of(LocalDate.now(), LocalTime.now()) -
从字符串解析(需符合 ISO 格式或自定义格式器):
LocalDateTime.parse("2024-10-05T14:30:45")
或用自定义格式器:DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").parse("2024-10-05 14:30:45")
修改与计算时间
LocalDateTime 是不可变对象,所有“修改”操作都返回新实例:
- 加减时间单位:
plusDays(1)、minusHours(2)、plusMinutes(30) - 调整字段值:
withYear(2025)、withHour(9)、withMinute(0) - 截断到指定精度:
truncatedTo(ChronoUnit.HOURS)→ 秒和毫秒归零
格式化与解析字符串
默认 toString() 输出 ISO 格式(如 2024-10-05T14:30:45.123)。如需自定义格式:
立即学习“Java免费学习笔记(深入)”;
- 使用预置格式器:
LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) - 自定义格式:
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss")) - 解析时注意:字符串必须匹配格式器定义,否则抛
DateTimeParseException
与时间戳、时区转换的注意事项
LocalDateTime 本身不含时区信息,不能直接转成 Instant 或其他带时区类型:
- 要转为绝对时间(Instant),需先关联时区:
localDateTime.atZone(ZoneId.systemDefault()).toInstant() - 从
Instant转回LocalDateTime,也必须指定时区:instant.atZone(ZoneId.of("Asia/Shanghai")).toLocalDateTime() - 避免直接用
LocalDateTime.now().atZone(ZoneOffset.UTC).toInstant()—— 这会错误地把本地时间当成 UTC 时间处理
不复杂但容易忽略:它只是“日历+钟表”,不是“世界统一时刻”。业务中只要不涉及跨时区协作或精确时间比对,它就是最简洁可靠的日期时间组合类型。


















