1

真夜中からLocalTime、特定の期間の長さのステップで s を 1 日の終わりまで反復したいと考えています。

例えば。期間が8hr10Minutesの場合、0:00、8:10、16:20(翌日なので24:30ではありません)

1 日未満の期間の次の作業コードがあります。より良い(特に読みやすい)ロジックはありますか?

Duration period = ...;
for(LocalTime t = LocalTime.MIDNIGHT, p = LocalTime.MIDNIGHT;
            t.isAfter(p) || t.equals(p) ; p = t, t = t.plus(period)){
    // do something with t
}

また、上記は 1 日の倍数に等しい期間 (無限ループ) で失敗するか、または 1 日よりも長い場合は、期間が 1 日より短くキャストされたかのように数値を返します (たとえば、24hr10min は 10Minutes と同じように動作します)。 )、したがって、それが同時に(明示的なifs なしで)修正できる場合は、それも使用します。

4

2 に答える 2

3

JodaStephen の答えは正しく、実装がそれほど難しくなく、エッジ ケースを修正する完全なソリューションだと思います。

LocalDate date = LocalDate.of(2014, 1, 1); // arbitrary date
LocalDateTime tsp = LocalDateTime.of(date, LocalTime.MIDNIGHT);

do {
    System.out.println(tsp.toLocalTime());
    tsp = tsp.plus(Duration.ofHours(8).plusMinutes(10));
} while (date.equals(tsp.toLocalDate()));

出力:

00:00
08:10
16:20

終了条件をモデル化するために任意の日付を使用しないソリューションでは、LocalTime. ただし、この機能は JSR-310 (java.time-package) では提供されておらず、特殊なケースのコーディングも実際には短くありません。

ここでユーザーが不満を言うことができる唯一のことは、ループなしでより短いソリューションを可能にする可能性のある繰り返しを含む、組み込みのストリームと時間間隔のサポートの欠如です。

于 2015-01-10T20:27:27.007 に答える