【问题标题】:Strange happenings when getting average milliseconds and converting to time获得平均毫秒并转换为时间时发生的奇怪事件
【发布时间】:2014-03-19 20:11:45
【问题描述】:

当我尝试从 long 值中获取平均值并将其转换为字符串(HH:mm:ss)格式时,我得到了一些奇怪的输出。我正在使用 Joda 时间库,它主要是救生员。

这是我目前所拥有的:

//this is in a static class
public static Duration calculateTime(Date start, Date end) { 
    Duration duration = new Duration(start.getTime(), end.getTime());
    return duration;
}

public static String convertMillisToTime(long milliseconds) {
    return String.format("%02d:%02d:%02d", 
            TimeUnit.MILLISECONDS.toHours(milliseconds),
            TimeUnit.MILLISECONDS.toMinutes(milliseconds) - 
            TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliseconds)),
            TimeUnit.MILLISECONDS.toSeconds(milliseconds) - 
            TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)));
}


long averageRunTime = 0;
averageRunTime += calculateTime(drs.startTime, drs.endTime).getMillis();

由于这是在数组列表中完成的,为了得到平均值,我正在取

averageRunTime = averageRunTime / (long)arrayList.size();

当我明白了

convertMillisToTime(averageRunTime);

它返回的值比我任何时候都高。 IE(我没有超过 11 小时的工作时间)但这给我返回了一个 11:mm:ss 的字符串。不太清楚为什么?

我使用的 convertMillisToTime 来自:How to convert milliseconds to "hh:mm:ss" format?

谁能指出我正确的方向?

提前谢谢你,

  • RR

编辑:我修改了使用 TimeUnit 将 long 转换为 time 的代码。奇怪的是,我抓了三个跑步(时间流),每次跑步的长度分别为 09:14:17、08:57:18、09:10:25,平均值为:10:27: 26.

【问题讨论】:

  • 对于时间的每一部分,您需要从您拥有的时间量中删除它,例如,一旦您计算了小时数,您需要从您的时间值中删除该时间量有。您还应该从最大组件到最小组件(小时到秒)进行计算
  • 您使用的是哪个Duration 类?算了,刚看到jodatime标签

标签: java time converter jodatime milliseconds


【解决方案1】:

您可以只使用 Joda Time 的格式化程序,例如...

public static final PeriodFormatter PERIOD_FORMATTER = new PeriodFormatterBuilder().printZeroAlways().
                appendHours().appendSeparator(":").
                appendMinutes().appendSeparator(":").
                appendSeconds().appendSeparator(".").
                appendMillis().toFormatter();

public static String toString(Duration duration) {
    return duration == null ? "[invalid duration]" : duration.toPeriod().toString(PERIOD_FORMATTER);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多