web-dev-qa-db-ja.com

Joda-timeのLocalDate間隔

Joda-timeには Interval クラスがあり、これは DateTime sの間の範囲です。 LocalDate sの範囲に何を使用できますか?

たとえば、「2011年1月1日から2011年10月1日まで」を表すオブジェクトが必要です。時間(またはタイムゾーン)は表示されません。

私の知る限り、joda-timeにはそのための機能は何も組み込まれていません。そのための何かが存在せず、私たちがそれを作成する場合、それはどのように見えるべきですか?最も重要なことは、joda-timeの設計との一貫性を保ちながら、他のタイプに最適に統合するために、joda-timeのどのインターフェイスを実装できるでしょうか。 ReadableIntervalを実装することは理にかなっていますか?ここで、getStartgetEndDateMidnightを返しますか?

29

私は個人的にGuavaの Range クラスを使用しています。

オープンエンド範囲をサポートします。含まれる境界または除外される境界を指定することもできます。他の多くの可能性の中で、それらは「日付の前」または「日付の後」を簡単に表すことを可能にします。

自由形式の間隔の例。

Range<LocalDate> before2010 = Range.atMost(new LocalDate("2009-12-31"));
Range<LocalDate> alsoBefore2010 = Range.lessThan(new LocalDate("2010-01-01"));

また、containsやcontainsAllなどの簡単なテスト述語、および共通部分操作も提供します。これはすべてテストされ、維持されています。

27
olivr

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 別名パーシャル(タイムゾーンなし)の検索間隔の概念はまだ存在していません。自分で実装する場合は、インターバルインターフェイスをまったく実装しないでください。前に述べたように、それは瞬間に基づいているので、それはあなたの願いを妨げるでしょう。

14

編集:おっと、前にそれを読み間違えました。

いいえ、私が知っているJodaTimeに相当するものはありません。

個人的には、開始日と終了日を含む独自のクラスを作成します:LocalDateIntervalまたはそのようなもの。 I would n't概念を混乱させるので、これにIntervalを再利用します:LocalDate値のペアしませんローカル日付は実際にはインスタントではないため、2つのインスタント。

個人的には、JodaTimeでIntervalが特に役立つとは思いません... NodaTimeから削除することを検討していました。今、私はすべきではないように聞こえます;)

7
Jon Skeet

DateMidnightの使用は、DSTスイッチで失敗することに注意してください。 date.toDateTimeAtStartOfDay()を使用して変換することをお勧めします。

LocalDateオブジェクトの間隔も必要でしたが、JodaTimeではサポートされていません。そのため、独自の実装を作成する必要がありました。後で私はそれを少し磨いてオープンソースにすることにしました。

あなたはそれをチェックアウトすることができます: https://github.com/serddmitry/joda-interval (MavenCentralで利用可能)。

2
Dmitry Serdiuk
public class LocalDateInterval {

   private LocalDate begin;
   private LocalDate end;

   public LocalDateInterval(LocalDate begin, LocalDate end) {
     this.begin = begin;
     this.end = end;
   }



}

これは私にとってはうまくいきます。

1
Stimpson Cat