Guava Stopwatch计算put平均耗时后如何转为hh:mm:ss:ms格式?
解决Guava Stopwatch平均耗时格式转换问题
我来帮你排查这个格式转换的问题——你当前的代码逻辑有个关键错误:直接用TimeUnit.NANOSECONDS.toXxx(result)得到的是总纳秒对应的完整Xxx单位总量,而不是扣除更高单位后剩余的部分。比如你的示例中128240纳秒,换算成毫秒是0.128毫秒,toMillis()会直接取整为0,所以所有字段都显示为0。
正确的转换逻辑
我们需要依次计算每个时间单位的数值,并且每次都扣除已经计算过的更高单位对应的纳秒数,只保留剩余的部分用于下一级单位计算。这样才能得到每个单位的实际剩余时长,而不是总纳秒对应的完整单位数。
修正后的代码实现
public String getAveragePutTime() { long totalNanos = getCurrentTime() / getPutCounter(); if (totalNanos <= 0) { return "00:00:00.000"; } // 计算各个单位,依次扣除已计算的部分 long hours = totalNanos / TimeUnit.HOURS.toNanos(1); long remaining = totalNanos % TimeUnit.HOURS.toNanos(1); long minutes = remaining / TimeUnit.MINUTES.toNanos(1); remaining = remaining % TimeUnit.MINUTES.toNanos(1); long seconds = remaining / TimeUnit.SECONDS.toNanos(1); remaining = remaining % TimeUnit.SECONDS.toNanos(1); // 计算精确到千分位的毫秒(处理小于1毫秒的纳秒) double milliseconds = remaining / (double) TimeUnit.MILLISECONDS.toNanos(1); // 格式化输出,补零让格式更规范统一 return String.format("%02d:%02d:%02d:%.3f", hours, minutes, seconds, milliseconds); }
代码细节说明
- 单位计算逻辑:通过
除法得到当前单位的数值,取余得到扣除当前单位后剩余的纳秒数,确保每一步只计算对应层级的时长。 - 精确毫秒处理:用浮点型计算毫秒,把剩余纳秒转换为小数形式的毫秒,避免小数值被直接取整丢失精度。
- 格式化输出:用
String.format()补零,让输出保持hh:mm:ss:ms的标准格式,比如你的示例中128240纳秒会显示为00:00:00:0.128,更符合实际的平均耗时。
内容的提问来源于stack exchange,提问作者Mefisto_Fell
相关产品推荐
相关产品推荐

