使用Joda Time汇总持续时间

时间:2014-12-11 14:16:36

标签: java android jodatime duration

我试图用以下格式加上持续时间:“hh:mm:ss”(例如:“08:55:12”)使用Joda Time:

PeriodFormatter formatter = new PeriodFormatterBuilder()
    .printZeroAlways().minimumPrintedDigits(2).appendHours()
        .appendLiteral(":").printZeroAlways().printZeroAlways()
            .minimumPrintedDigits(2).appendMinutes().appendLiteral(":")
                .printZeroAlways().minimumPrintedDigits(2).appendSeconds()
                    .toFormatter();
Duration totalTime = Duration.ZERO;


for (Entry entry : entries) {
    Period period = formatter.parsePeriod(entry.getTime());
    Duration duration = period.toStandardDuration();
    totalTime = totalTime.plus(duration);
}

Period totalPeriod = totalTime.toPeriod();
if (totalPeriod.getHours() < 10) {
    hours = "0" + totalPeriod.getHours();
} else {
    hours = Integer.toString(totalPeriod.getHours());
}
mTextView.setTextView(hours
    + String.format("%02d:%02d", totalPeriod.getMinutes(),
        totalPeriod.getSeconds()));

出于某种原因,它给了我错误的结果(总计持续时间太长)。你能帮我找到这个问题的原因吗?

1 个答案:

答案 0 :(得分:4)

我认为你刚忘记小时部分和分钟部分之间的冒号导致总和看起来像2701:44而不是27:01:44(这是一个例子的总和由Joda-Time正确计算的三个元素“03:20:45”,“00:40:11”,“23:00:48”。

所以你的解决方案最终应该是这样的:

String output =
    hours + String.format(":%02d:%02d", totalPeriod.getMinutes(), totalPeriod.getSeconds());
System.out.println(output); // 27:01:44

但更简单的是重复使用您的格式化程序对象进行打印

System.out.println(formatter.print(totalPeriod)); // 27:01:44

如果您对基于模式的解决方案感兴趣,请使用此示例查看我的库Time4J:

// input
String[] periods = { "03:20:45", "00:40:11", "23:00:48" };

// initialization
Duration.Formatter<ClockUnit> timeFormat = 
    Duration.Formatter.ofPattern(ClockUnit.class, "hh:mm:ss");
Duration<ClockUnit> dur = Duration.ofZero();

// calculate the sum
for (String entry : periods) { 
    dur = dur.plus(timeFormat.parse(entry));
}

dur = dur.with(Duration.STD_CLOCK_PERIOD); // normalization
System.out.println(timeFormat.format(dur)); // 27:01:44