System.currentTimeMillis() 返回自1970年1月1日UTC以来的毫秒级绝对时间戳,适用于日志打点、耗时统计、缓存过期等场景,但受系统时钟调整影响,精度为毫秒级,不适用于纳秒级性能测试。

System.currentTimeMillis() 是 Java 中获取当前时间(毫秒级)最常用的方法,它返回自 1970年1月1日 00:00:00 UTC(即 Unix 纪元)以来的毫秒数,属于“绝对时间戳”,适合记录物理运行期的绝对时刻。
注意:它不是纳秒级高精度计时器,也不保证单调递增(受系统时钟调整影响),但对大多数业务时间记录、日志打点、超时判断等场景完全够用。
怎么用 currentTimeMillis 记录绝对时间
直接调用即可获取当前绝对时间戳,通常存为 long 类型:
long startTime = System.currentTimeMillis(); // 记录开始时刻 // ... 执行一段逻辑 ... long endTime = System.currentTimeMillis(); // 记录结束时刻 long duration = endTime - startTime; // 持续时间(毫秒)
适用场景举例
-
日志时间戳:每条日志开头加上
System.currentTimeMillis(),便于按真实时间排序和排查问题 - 接口耗时统计:在方法入口和出口分别记录,计算差值作为响应时间
- 缓存过期判断:存储数据时附带写入时间戳,读取时对比当前时间是否超时
- 简单定时任务触发:比如“5秒后执行”,可记下当前时间 + 5000,循环轮询比较
关键注意事项
-
不是线程安全问题,但要注意系统时钟跳变:如果系统管理员手动修改了系统时间,或 NTP 同步导致时间回拨/快进,
currentTimeMillis()的值可能突变,造成持续时间算出负数或异常大 - 精度有限:底层依赖操作系统时钟,Windows 上通常只有 10–16ms 分辨率,Linux 一般更高,但仍是毫秒级
-
不适用于性能微基准测试:测纳秒级开销请用
System.nanoTime(),它更稳定、单调、高精度,但不表示绝对时间
和 nanoTime 的区别(简明对比)
-
currentTimeMillis()→ 绝对时间,单位毫秒,可跨进程比对,受系统时钟影响 -
System.nanoTime()→ 相对时间,单位纳秒,仅用于测量间隔,不反映真实时刻,不受系统时钟调整影响

















