2016-12-25 7 views
2

Java 8の2つの期間を比較するにはどうすればよいですか?Java 8の2つのjava.time.Periodを比較するにはどうすればよいですか?

など。

Period one = Period.of(10,0,0); 
Period two = Period.of(8,0,0); 

この場合、1は2より大きい。

+8

期間は比較できません。そしてそれには理由があります。例えば:30日の期間より1か月の期間が大きいか小さいか?答えはそれが依存しているということです。 2つの期間を特定のLocalDateに追加し、2つのLocalDateのどちらが大きいかを確認することができます。しかし、結果はあなたがどのLocalDateから出発するかによって決まります。 –

+1

@JBNizet JSR-310デザイナーは、「期間」は完全ではないと訂正してはなりませんが、「P1M-310」を迂回する狂った定義と実装でisNegative() 30D "問題。非常に病気。 –

答えて

1

JB Nizetが正しく言った。 期間を比較することはできません。期間クラスのjava文書ごとに、期間(期間)と同様のクラスがあり、ビジネス要件に応じて使用することができます。

"期間と期間は、ZonedDateTimeに追加された夏時間の処理が異なります。期間には正確な秒数が追加されるため、1日の期間は常に正確に24時間です。現地時間を維持しようとする概念的な日を追加してください。

Period period = Period.of(10, 0, 0); 
Period period2 = Period.of(10, 0, 0); 

// No compareTo method in period 
System.out.println(period.compareTo(period2)); 

Duration duration = Duration.ofDays(3); 
Duration duration2 = Duration.ofDays(3); 

// Can compare durations as it gives you the exact time 
System.out.println(duration.compareTo(duration2)); 
3

2つのPeriodオブジェクトの比較は、一般的なケースでは、月の未定義の標準的な長さに起因する意味がないことは事実です。

しかし、多くの状況では、次のような実装で十分に生きることができます。契約はcompareTo()の契約に似ています:

public int comparePeriodsApproximately(Period p1, Period p2) { 
    return period2Days(p1) - period2Days(p2); 
} 

private int period2Days(Period p) { 
    if (p == null) { 
     return 0; 
    } 
    return (p.getYears() * 12 + p.getMonths()) * 30 + p.getDays(); 
} 
関連する問題