localdatetime 是 java 8 引入的不可变日期时间类,表示不带时区的本地日期和时间,适用于系统本地时间、日程安排及数据库存取;创建方式包括 now()、of()、parse() 和从时间戳转换;支持加减时间、调整字段、截断精度;可格式化为字符串、转为 date、直接用于 jdbc 和 json 序列化;但无时区概念,跨时区场景应使用 zoneddatetime 或 instant。

LocalDateTime 是 Java 8 引入的不可变日期时间类,专门用于表示“不带时区的本地日期和时间”,比如 2024-05-20T14:30:45.123。它不包含时区或偏移信息,适合处理系统本地时间、日程安排、数据库存取(如 MySQL 的 DATETIME 类型)等场景。
如何创建 LocalDateTime 实例
有多种常用方式获取当前或指定的 LocalDateTime:
- 获取当前系统时间:
LocalDateTime.now() - 指定年月日时分秒:
LocalDateTime.of(2024, 5, 20, 14, 30, 45)或LocalDateTime.of(LocalDate.now(), LocalTime.now()) - 从字符串解析(需符合 ISO 格式或自定义格式器):
LocalDateTime.parse("2024-05-20T14:30:45") - 从毫秒时间戳转换(需先转为 Instant + 时区):
Instant.ofEpochMilli(1716215445000L).atZone(ZoneId.systemDefault()).toLocalDateTime()
怎么同时操作日期和时间字段
LocalDateTime 提供了统一的“日期+时间”视图,所有修改方法都返回新对象(不可变性):
- 加减时间单位:
plusDays(1)、minusHours(2)、plusMinutes(30) - 调整具体字段:
withYear(2025)、withHour(9)、withSecond(0) - 截断到指定精度:
truncatedTo(ChronoUnit.HOURS)(如把14:30:45变成14:00:00)
怎么与 Date、String、数据库交互
实际开发中常需类型转换:
- 转为字符串:用内置格式器
localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME),或自定义如DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") - 转为旧版 Date:
Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()) - JDBC 存取:现代 JDBC 驱动(如 MySQL Connector/J 8.0+)原生支持
LocalDateTime,可直接用PreparedStatement.setObject(1, localDateTime) - JSON 序列化(如 Jackson):默认会转成 ISO 字符串;若需自定义格式,可用
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
注意事项:它不处理时区
LocalDateTime 没有时区概念,所以不能直接表示“北京时间下午2点”或“纽约时间上午4点”。如果涉及跨时区计算、用户本地时间展示、服务器时间统一等需求,应改用 ZonedDateTime 或 Instant + 时区显式转换。误用 LocalDateTime 处理时区问题,是生产环境常见 bug 来源之一。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











