3

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

但是在打印时间时,秒数显示为整秒,因此当倒计时达到例如 900 毫秒时,将打印“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 实现这一点而无需编写我自己的格式化程序?

4

3 回答 3

3

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

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

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

于 2010-05-06T12:29:28.353 回答
1

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

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

(顺便说一句,看到在每次调用中实例化格式化程序让我感到不舒服)

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

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

正如 Jon 所指出的,这仅对积极的持续时间有意义。

于 2010-05-06T16:30:27.803 回答
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()
        )
    );
}
于 2010-05-06T16:48:43.113 回答