LocalDateTime.now() 获取系统默认时区的本地日期时间,不包含时区信息,线程安全、纳秒精度;需跨时区或持久化时应选用 ZonedDateTime 或 Instant,并通过 ZoneId 转换。

使用 LocalDateTime.now() 可以直接获取当前系统的本地日期和时间,它不包含时区信息,仅基于 JVM 所在主机的默认时区设置(实际是系统默认 ZoneId 的本地时间)。
LocalDateTime.now() —— 最常用、最简洁的方式
这是获取“年-月-日 时:分:秒”本地时间的首选方法,适用于大多数不需要时区或毫秒精度的业务场景(如日志记录、表单提交时间、缓存过期判断等)。
- 它自动使用系统默认时区对应的本地时间(例如中国是
Asia/Shanghai,即东八区) - 返回的是不可变对象,线程安全
- 精度为纳秒(实际取决于系统时钟,通常到毫秒级)
- 示例:LocalDateTime now = LocalDateTime.now(); → 输出类似
2024-06-15T14:23:45.123
如果需要指定时区,用带参数的 now(ZoneId)
当你的应用部署在多时区环境,或需统一按某个时区(如 UTC 或北京)生成时间,应显式传入 ZoneId:
- LocalDateTime.now(ZoneId.of("UTC")) → 获取 UTC 对应的本地时间(不含时区字段)
- LocalDateTime.now(ZoneId.systemDefault()) 等价于无参版本,明确表达意图
- 注意:
LocalDateTime本身不存时区,所以now(ZoneId)是先获取该时区的瞬时时间,再“转换”为对应本地表示(去掉时区信息)
别误用:ZonedDateTime / Instant 才真正代表带时区或绝对时刻
如果你需要跨系统协调、存储到数据库、或做时间计算(如加减 2 小时后是否跨天),仅靠 LocalDateTime 容易出错:
立即学习“Java免费学习笔记(深入)”;
-
ZonedDateTime.now() → 返回含时区的完整时间(如
2024-06-15T14:23:45.123+08:00[Asia/Shanghai]) - Instant.now() → 返回从 1970-01-01T00:00:00Z 开始的毫秒/纳秒数,是时区无关的绝对时刻,适合系统间传输或持久化
- LocalDateTime 不能直接和 Instant 相互转换,必须通过 ZoneId 中转(如
local.atZone(ZoneId.systemDefault()).toInstant())
格式化输出建议用 DateTimeFormatter
不要用 SimpleDateFormat(已过时且非线程安全),推荐:
- DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
-
DateTimeFormatter.ISO_LOCAL_DATE_TIME(内置常量,如
2024-06-15T14:23:45) - 示例:now.format(DateTimeFormatter.ofPattern("HH:mm:ss")) → 得到
"14:23:45"


















