推荐使用 Instant.now().toEpochMilli() 获取毫秒值;纳秒值需组合 getEpochSecond() 与 getNano(),高精度计时应改用 System.nanoTime()。

在 Java 中获取当前时间戳的毫秒值和纳秒值,推荐使用 java.time 包中的标准 API(Java 8+),避免使用过时的 Date 或 System.currentTimeMillis() 等非类型安全方式。
获取当前时间戳毫秒值(推荐:Instant)
Instant 是 Java 8 引入的不可变时间戳类,表示从 1970-01-01T00:00:00Z(UTC)开始的纳秒级时刻。它天然支持毫秒精度提取:
- 用
Instant.now().toEpochMilli()直接获取毫秒值(long类型),等价于System.currentTimeMillis(),但语义更清晰、线程安全、不可变; - 该值与系统时钟同步,精度取决于底层 OS 和 JVM 支持(通常为毫秒级,部分系统可达微秒);
- 示例:long millis = Instant.now().toEpochMilli(); // 如 1717023456789
获取当前时间戳纳秒值(需组合计算)
Java 标准 API 并不直接提供“自纪元起的纳秒总数”(因为纳秒数过大,long 已无法容纳完整纳秒值 —— 约需 64 位存毫秒 + 额外 30 位存纳秒偏移)。因此实际做法是:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 用
Instant.now()获取高精度瞬时对象; - 调用
.getEpochSecond()得到整秒数(long); - 调用
.getNano()得到该秒内的纳秒偏移(0–999,999,999); - 若需“纳秒级时间戳”用于高精度计时(如性能分析),应改用
System.nanoTime()—— 它返回的是相对起始点的纳秒差值,**不对应绝对时间**,但精度更高、无系统时钟跳变影响; - 示例:Instant now = Instant.now();
long seconds = now.getEpochSecond();
int nanos = now.getNano(); // 当前秒内第 nanos 纳秒
注意 System.nanoTime() 的适用场景
System.nanoTime() 返回的是 JVM 启动后或某个未指定起点的纳秒计数器值,适合测量耗时,但不能转换为标准时间戳:
立即学习“Java免费学习笔记(深入)”;
- 它不关联 1970 年纪元,不能用于日期计算或网络传输;
- 两次调用差值可精确到纳秒(实际取决于硬件,常见为数十纳秒);
- 示例:long start = System.nanoTime();
// 执行操作
long durationNs = System.nanoTime() - start;
不推荐的方式(兼容性或设计问题)
以下方式虽能运行,但不建议在新代码中使用:
-
new Date().getTime():依赖已弃用的Date构造逻辑,语义模糊; -
Calendar.getInstance().getTimeInMillis():API 冗长、可变、线程不安全; -
System.currentTimeMillis():虽高效且常用,但缺乏类型语义,不利于代码可读与扩展(如后续需时区处理)。

















