直接调用System.currentTimeMillis()可获取自1970年1月1日UTC起的毫秒时间戳,用于记录操作时间点和计算耗时,需避免中间插入逻辑,建议用long存储并统一封装工具类,注意系统时钟跳变影响。

直接调用 System.currentTimeMillis() 获取当前毫秒时间戳,就能记录关键操作的时间点。它返回的是自 1970 年 1 月 1 日 00:00:00 UTC 起经过的毫秒数,精度为毫秒(实际取决于系统时钟,通常足够用于业务日志和耗时统计)。
记录单个时间点
在操作开始前或完成后立即调用,保存到变量中:
long startTime = System.currentTimeMillis(); doSomethingImportant(); long endTime = System.currentTimeMillis();
注意:不要在耗时操作中间插入其他逻辑(比如日志、网络调用),否则会影响时间点准确性。
计算耗时
用结束时间减去开始时间,得到操作耗时(单位:毫秒):
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
long duration = endTime - startTime;- 建议用
long类型存储,避免整型溢出(尤其跨秒操作) - 如果需要更精确(微秒级),可考虑
System.nanoTime(),但它不表示绝对时间,不能用于跨进程或持久化场景
结合日志或监控打点
把时间戳作为上下文写入日志,便于追踪和排查:
- 记录开始时间:
log.info("Start processing, ts={}", System.currentTimeMillis()); - 记录完成时间及耗时:
log.info("Finished in {}ms, ts={}", duration, endTime); - 生产环境建议统一封装工具类(如
StopWatch或自定义TimingContext),避免重复写时间戳逻辑
注意事项
该方法依赖系统时钟,若系统时间被手动调整或 NTP 同步导致跳变,时间戳可能不连续或回退。对强一致性要求的场景(如分布式事务排序),应改用 System.nanoTime() + 单调时钟,或引入 单调递增的计时器。

















