web-dev-qa-db-ja.com

Java 8)でTemporalAmountまたはTemporalUnitを使用する違いは何ですか?

Java 8に時間計算を使用するコードの一部を記述します。異なる方法で実装できることを理解しています。以下の簡単なコードを見てみましょう。もちろん同じ結果ですが、 Java 8?

LocalTime time = LocalTime.now();
// 1st way
LocalTime plusOp = time.plus(Duration.ofMinutes(10L));
// 2nd way
LocalTime plusOp2 = time.plus(10L, ChronoUnit.MINUTES);
System.out.println(plusOp);
System.out.println(plusOp2);
// 3. way simply
 time.plusMinutes(10L);

前もって感謝します。

15
Ugur Artun

Durationは、「時間」、「分」、「秒」、「日」などの固定長の期間のみを処理できます(1日あたり正確に24時間を想定しています)。月は長さが異なるため、Durationで「月」を使用することはできません。

Period-その他の一般的なTemporalAmount実装-年、月、日を個別に表します。

個人的に私はお勧めします:

  • 事前に単位がわかっている場合は、適切なplusXxxメソッドを使用してください。 time.plusMinutes(10)。それはそれが得るのと同じくらい読みやすいです。
  • 「論理的な」カレンダーの金額を表現しようとしている場合は、Periodを使用します
  • 「固定長」の金額を表す場合は、Durationを使用します

PeriodDurationが異なる可能性がある場所の例を次に示します。

import Java.time.*;

public class Test {
    public static void main(String[] args) {
        ZoneId zone = ZoneId.of("Europe/London");
        // At 2015-03-29T01:00:00Z, Europe/London goes from UTC+0 to UTC+1
        LocalDate transitionDate = LocalDate.of(2015, 3, 29);
        ZonedDateTime start = ZonedDateTime.of(transitionDate, LocalTime.MIDNIGHT, zone);
        ZonedDateTime endWithDuration = start.plus(Duration.ofDays(1));
        ZonedDateTime endWithPeriod = start.plus(Period.ofDays(1));
        System.out.println(endWithDuration); // 2015-03-30T01:00+01:00[Europe/London]
        System.out.println(endWithPeriod);   // 2015-03-30T00:00+01:00[Europe/London]
    }
}

本当に必要になるまで、効率について心配する必要はありません。その時点で、さまざまなオプションをテストできるようにベンチマークを用意する必要があります。

19
Jon Skeet

ソースを見ると、plus(long amountToAdd, TemporalUnit unit)メソッドはplusXXXメソッドを使用して結果を生成します。したがって、ここでは効率についての議論はありません。

代わりに、シナリオに最も適した方を使用します。ユーザー入力を使用して時間や分などを追加するかどうかを決定する場合は、plus()メソッドの方が適していることをお勧めします。そうしないと、plusXXXを使用すると、コードが読みやすくなる可能性があります。

3
Duncan Jones