2012-01-11 10 views
8

私はJoda-Timeを使って表現しようとしている営業時間についてのデータがあります。Joda-Timeを使用して部分区間を表現するにはどうすればよいですか?

日の一般的な営業時間は次のようになります。ジョダタイムエンティティでそれらを表現するための9から12まで、および13から20

オープン

私の主な理由は、にありますそれらを検証:

  • 営業時間が有効であることを確認し(9が12、などの前にある)
  • 全くオープン間隔が(「9-12と11-13は」違法で)重複していないことを確認

APIを使用すると、Joda-Time Intervalクラスにはこの検証を行うために必要なメソッドがありますが、Intervalsは日付 - 時間連続のインスタントのペアです。私は絶対時間から独立して表現したいと思います.2つのLocalTime部分の間隔のようなものです。これは可能ですか?

+2

私はあなたがすでに最良の答えの男を提供したと思います。私はそれをOpenTimeRangeとして実装し、 'LocalTime'の開始と終了を指定してから、一日の営業時間を指定する配列を持っています。 – Gray

答えて

5

はここでカスタム時間間隔の試みです(かなりのソリューションのようにグレーのコメント):

 
import org.joda.time.*; 

public class TimeInterval { 
    private static final Instant CONSTANT = new Instant(0); 
    private final LocalTime from; 
    private final LocalTime to; 

    public TimeInterval(LocalTime from, LocalTime to) { 
     this.from = from; 
     this.to = to; 
    } 

    public boolean isValid() { 
     try { return toInterval() != null; } 
     catch (IllegalArgumentException e) { return false;} 
    } 

    public boolean overlapsWith(TimeInterval timeInterval) { 
     return this.toInterval().overlaps(timeInterval.toInterval()); 
    } 

    /** 
    * @return this represented as a proper Interval 
    * @throws IllegalArgumentException if invalid (to is before from) 
    */ 
    private Interval toInterval() throws IllegalArgumentException { 
     return new Interval(from.toDateTime(CONSTANT), to.toDateTime(CONSTANT)); 
    } 
} 
+3

はい、この種のインターバルクラスを自分で書く必要があります。ところで、あなたのtoInterval()メソッドは現在の瞬間を2回(各toDateTimeTodayに1回)取得するので、壊れています。真夜中のちょうど両側(競合状態)と正確に呼ばれると、2つの異なる日付を返すことができます。 – JodaStephen

+0

レビューをいただき、ありがとうございました。私は一定の日付の間隔を常に評価するようにコードを更新しました。 –

関連する問題