system.currenttimemillis() 用于记录日志触发的精确时刻,它返回自1970-01-01 utc起的毫秒数,精度高、开销小、线程安全;应在业务逻辑入口处立即调用,而非依赖日志框架自动添加的时间,以准确捕获事件发生时刻。

直接用 System.currentTimeMillis() 获取当前时间戳,再把它写进日志里,就能记录日志触发的精确时刻。
为什么用 currentTimeMillis 记录触发时间
它返回的是自 1970-01-01 00:00:00 UTC 起经过的毫秒数,精度高、开销小、线程安全,适合在日志打点时快速捕获“那一刻”的时间。注意:它反映的是调用该方法那一瞬间的系统时间,不是日志最终写入文件或发送到远端的时间。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
在日志语句中嵌入时间戳
最常见做法是在打印日志前立即获取时间戳,然后拼入日志内容:
- 使用 SLF4J 或 Log4j 时,通常不手动拼时间戳,而是靠日志框架自动添加(如配置 pattern 中含
%d{yyyy-MM-dd HH:mm:ss.SSS}); - 若需单独记录“业务触发时刻”(比如某个方法入口、事件发生点),可在关键位置显式调用:
long triggerTime = System.currentTimeMillis();
logger.info("订单创建触发,ts={}", triggerTime); - 避免在日志格式化之后才取时间戳,否则会记录日志准备完成的时间,而非业务动作发生的实际时间。
和日志框架自带时间的区别
日志框架(如 Logback)默认会在每条日志开头加一个时间字段,那个时间也是基于 currentTimeMillis(或更优的 System.nanoTime() 配合时钟校准)生成的,但它是日志事件构建时的时间。如果你关心的是“用户点击按钮”“消息到达”这类业务事件的发生时间,建议在业务逻辑入口处主动捕获并传入日志上下文,而不是依赖框架自动打的时间——因为中间可能有队列、拦截器、序列化等延迟。
注意事项
- 不要重复封装或缓存这个值用于多条日志,每次触发都应重新调用,保证时间准确性;
- 如果需要纳秒级精度(极少场景),可考虑
System.nanoTime(),但它不能转为真实时间,只适合计算耗时; - 跨服务调用时,单靠本机时间戳无法对齐全局顺序,需结合 TraceID 或分布式时钟(如 Google TrueTime、混合逻辑时钟);
- 服务器时钟不同步会影响时间可信度,生产环境务必开启 NTP 同步。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










