使用Joda Time打印时累计毫秒

时间:2010-05-06 12:16:53

标签: java jodatime

我正在使用Joda Time实施倒计时。我只需要秒的显示精度。

然而,当打印时间时,秒数显示为全秒,因此当倒计时达到例如900ms时,则打印“0”秒,但作为倒计时,显示更有意义“1”秒,直到时间实际达到0ms。

示例:

void printDuration(Duration d) {
  System.out.println(
    d.toPeriod(PeriodType.time()).toString(
      new PeriodFormatterBuilder().printZeroAlways().appendSeconds().toFormatter()
    )
  );
}

printDuration(new Duration(5000)); // Prints "5" => OK
printDuration(new Duration(4900)); // Prints "4" => need "5"
printDuration(new Duration(1000)); // Prints "1" => OK
printDuration(new Duration(900));  // Prints "0" => need "1"
printDuration(new Duration(0));    // Prints "0" => OK

基本上我需要将显示的秒数从毫秒向上舍入而不是向下舍入。有没有办法用Joda实现这一点而无需编写我自己的格式化程序?

3 个答案:

答案 0 :(得分:3)

最简单的方法是采用现有的持续时间,适当地围绕毫秒来创建新的持续时间,并格式化:

private static Duration roundToSeconds(Duration d) {
  return new Duration(((d.getMillis() + 500) / 1000) * 1000);
}

(请注意,这假定为正的持续时间,否则舍入将为奇数。)

答案 1 :(得分:1)

您是否有兴趣仅打印几秒钟的持续时间?

如果没有,您的printDuration方法错误(它为0打印Duration(60000) - 即仅打印秒分数

(顺便说一下,看到格式化程序在每个调用中实例化都让我无法轻松)

如果是,(或者如果您对打印“3600”的持续时间为1小时感到满意)您实际上不需要时间智能,那么自己进行格式化会更简单:

static void printDuration(Duration d) {
      int secs = (int)((d.getMillis()+999)/1000); 
      System.out.println(secs);
}

正如乔恩所指出的,这只适用于积极的持续时间。

答案 2 :(得分:0)

import java.math.BigDecimal;

private Duration round(Duration d) {
  return Duration.standardSeconds(new BigDecimal(d.getMillis()).divide(1000, 0, BigDecimal.ROUND_up));
}

然后:

void printDuration(Duration d) {
    System.out.println(
        round(d).toPeriod(PeriodType.time()).toString(
            new PeriodFormatterBuilder().printZeroAlways().appendSeconds().toFormatter()
        )
    );
}