Instant 表示自 1970-01-01T00:00:00Z 起的纳秒级时间点,无时区;常用 Instant.now() 获取当前时刻,支持 Clock 参数;可与 long 毫秒/秒互转,注意精度截断;转换 LocalDateTime/ZonedDateTime 需显式指定时区;格式化需先转 ZonedDateTime 再用 DateTimeFormatter。

Java 中 Instant 表示的是时间线上的一个精确点(纳秒级),它不包含时区信息,本质是自 1970-01-01T00:00:00Z(UTC)以来的秒数和纳秒数。获取和转换 Instant 是日常开发中处理时间的基础操作。
如何获取当前 Instant
最常用的方式是调用静态方法 Instant.now():
- 直接获取系统默认时钟下的当前时刻(基于 UTC)
- 如果需要指定时钟(比如测试时固定时间),可传入
Clock实例,如Instant.now(Clock.fixed(...))
Instant 与 long 时间戳(毫秒/秒)互转
Instant 内部以纳秒为单位存储,但常需与传统 long 类型时间戳(毫秒或秒)交互:
- 从毫秒时间戳转
Instant:Instant.ofEpochMilli(1717023456789L) - 从秒时间戳转
Instant:Instant.ofEpochSecond(1717023456L) -
Instant转毫秒:instant.toEpochMilli() -
Instant转秒:instant.getEpochSecond()
注意:toEpochMilli() 会截断纳秒部分;若需保留纳秒精度,可用 instant.getNano() 配合秒值计算。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
Instant 与 LocalDateTime / ZonedDateTime 转换
Instant 本身无时区,转换必须显式指定时区:
- 转
ZonedDateTime(推荐):instant.atZone(ZoneId.systemDefault())或instant.atZone(ZoneId.of("Asia/Shanghai")) - 再从
ZonedDateTime提取LocalDateTime:zdt.toLocalDateTime() - 反向转换(
LocalDateTime→Instant)必须补全时区:localDateTime.atZone(ZoneId.of("Asia/Shanghai")).toInstant()
⚠️ 直接用 LocalDateTime.toInstant() 会抛异常,因为缺少时区上下文。
格式化 Instant 为字符串
Instant 默认 toString() 输出 ISO-8601 格式(如 2024-05-30T08:24:16.789Z),带 'Z' 表示 UTC:
- 如需自定义格式(如含中文、不带 'Z'),先转成
ZonedDateTime,再用DateTimeFormatter - 例如:
instant.atZone(ZoneId.of("Asia/Shanghai")).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))

















