直接用减法即可,两个long类型时间戳相减得毫秒差值;system.currenttimemillis()返回utc毫秒时间戳,相减结果不受时区影响,精度为毫秒级,推荐java 8+使用instant和duration api进行更严谨的时间差计算。

直接用减法就行,两个 long 类型的时间戳相减,结果就是毫秒差值。
获取时间戳并计算差值
System.currentTimeMillis() 返回的是从 1970-01-01 00:00:00 UTC 到当前时刻的毫秒数(即 Unix 时间戳的毫秒表示)。它本身是 long 类型,所以可以直接做算术运算:
- 先记录起始时间戳
- 再记录结束时间戳
- 用结束时间减去起始时间,得到经过的毫秒数
示例:
long start = System.currentTimeMillis(); // 执行一些操作,比如 sleep 或业务逻辑 Thread.sleep(1234); long end = System.currentTimeMillis(); <p>long diffMs = end - start; // 结果是 1234 左右(毫秒)</p>
转成常用单位更直观
毫秒差值对人不太友好,通常会转成秒、分钟等:
-
秒:除以 1000,注意用
double或long避免整除丢失精度 - 分钟:除以 60000(1000 × 60)
- 小时:除以 3600000(1000 × 60 × 60)
例如:
long diffMs = end - start; double diffSec = diffMs / 1000.0; // 保留小数 long diffSecInt = diffMs / 1000; // 向下取整秒数 long diffMin = diffMs / 60000;
注意时区和精度问题
currentTimeMillis() 是系统本地时间对应的毫秒值,不依赖时区设置 —— 它本质是 UTC 时间戳,只是显示时才受时区影响。所以两个时间戳相减,结果完全不受时区干扰,是准确的经过时间。
- 适合测耗时、判断超时、计算间隔
- 不适合直接格式化为“年月日”——要转
Date或Instant再处理 - 精度通常是毫秒级,部分系统可能只到 10–15 毫秒(取决于 OS 和 JVM 实现)
替代方案(Java 8+ 推荐)
如果要做更严谨的时间差计算(比如跨天、考虑夏令时),建议用 java.time API:
-
Instant.now()获取高精度时间点 -
Duration.between(start, end)得到Duration对象,支持toMillis()、toSeconds()等方法 - 语义更清晰,且线程安全、不可变
简单对比:
Instant start = Instant.now(); Thread.sleep(1234); Instant end = Instant.now(); long diffMs = Duration.between(start, end).toMillis(); // 同样是 1234
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











