Joda-timeには Interval クラスがあり、これは DateTime sの間の範囲です。 LocalDate sの範囲に何を使用できますか?
たとえば、「2011年1月1日から2011年10月1日まで」を表すオブジェクトが必要です。時間(またはタイムゾーン)は表示されません。
私の知る限り、joda-timeにはそのための機能は何も組み込まれていません。そのための何かが存在せず、私たちがそれを作成する場合、それはどのように見えるべきですか?最も重要なことは、joda-timeの設計との一貫性を保ちながら、他のタイプに最適に統合するために、joda-timeのどのインターフェイスを実装できるでしょうか。 ReadableInterval
を実装することは理にかなっていますか?ここで、getStart
とgetEnd
はDateMidnight
を返しますか?
私は個人的にGuavaの Range クラスを使用しています。
オープンエンド範囲をサポートします。含まれる境界または除外される境界を指定することもできます。他の多くの可能性の中で、それらは「日付の前」または「日付の後」を簡単に表すことを可能にします。
自由形式の間隔の例。
Range<LocalDate> before2010 = Range.atMost(new LocalDate("2009-12-31"));
Range<LocalDate> alsoBefore2010 = Range.lessThan(new LocalDate("2010-01-01"));
また、containsやcontainsAllなどの簡単なテスト述語、および共通部分操作も提供します。これはすべてテストされ、維持されています。
Interval クラスは、1ミリ秒の瞬間から別の瞬間までの時間間隔を表します(タイムゾーンで完了)。 DateMidnight はそのような瞬間です。したがって、DateMidnightsの間隔の提案された実装はすでにそこにあります。
Interval i = new Interval(
new DateMidnight(2010, 3, 2), new DateMidnight(2010, 3, 5));
i.contains(new DateTime(2010, 3, 1, 23, 59, 59, 999)); // == false
i.contains(new DateTime(2010, 3, 2, 0, 0, 0, 0)); // == true
i.contains(new DateTime(2010, 3, 4, 23, 59, 59, 999)); // == true
i.contains(new DateTime(2010, 3, 5, 0, 0, 0, 0)); // == false
ただし、 LocalDates 別名パーシャル(タイムゾーンなし)の検索間隔の概念はまだ存在していません。自分で実装する場合は、インターバルインターフェイスをまったく実装しないでください。前に述べたように、それは瞬間に基づいているので、それはあなたの願いを妨げるでしょう。
編集:おっと、前にそれを読み間違えました。
いいえ、私が知っているJodaTimeに相当するものはありません。
個人的には、開始日と終了日を含む独自のクラスを作成します:LocalDateInterval
またはそのようなもの。 I would n't概念を混乱させるので、これにInterval
を再利用します:LocalDate
値のペアしませんローカル日付は実際にはインスタントではないため、2つのインスタント。
個人的には、JodaTimeでInterval
が特に役立つとは思いません... NodaTimeから削除することを検討していました。今、私はすべきではないように聞こえます;)
DateMidnight
の使用は、DSTスイッチで失敗することに注意してください。 date.toDateTimeAtStartOfDay()
を使用して変換することをお勧めします。
LocalDateオブジェクトの間隔も必要でしたが、JodaTimeではサポートされていません。そのため、独自の実装を作成する必要がありました。後で私はそれを少し磨いてオープンソースにすることにしました。
あなたはそれをチェックアウトすることができます: https://github.com/serddmitry/joda-interval (MavenCentralで利用可能)。
public class LocalDateInterval {
private LocalDate begin;
private LocalDate end;
public LocalDateInterval(LocalDate begin, LocalDate end) {
this.begin = begin;
this.end = end;
}
}
これは私にとってはうまくいきます。