You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
}

代码细节说明

  1. 单位计算逻辑:通过除法得到当前单位的数值,取余得到扣除当前单位后剩余的纳秒数,确保每一步只计算对应层级的时长。
  2. 精确毫秒处理:用浮点型计算毫秒,把剩余纳秒转换为小数形式的毫秒,避免小数值被直接取整丢失精度。
  3. 格式化输出:用String.format()补零,让输出保持hh:mm:ss:ms的标准格式,比如你的示例中128240纳秒会显示为00:00:00:0.128,更符合实际的平均耗时。

内容的提问来源于stack exchange,提问作者Mefisto_Fell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:11:21