3

JodaTimeを使用してカウントダウンを実装しています。必要なのは秒の表示精度だけです。

ただし、時刻を印刷する場合、秒はフル秒として表示されるため、たとえば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でこれを実現する方法はありますか?

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」を1時間印刷することに満足している場合)、実際には時間インテリジェンスは必要ありません。自分でフォーマットを行う方が簡単です。

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

ジョンが指摘するように、これはポジティブな期間にのみ意味があります。

于 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 に答える