2017-09-29 8 views
0

POCOイベント{OffsetDateTimeスタート、OffsetDateTime終了}とPOCO試用{OffsetDateTimeスタート、OffsetDateTime終了}を考えると2 OffsetDateTimeが別の2つのOffsetDateTime内にあるかどうかを確認するにはどうすればよいですか?

トライアル典型的なスパン時間、およびイベントが数秒かけて起こる

トライアルでイベントが発生したかどうかをテストするにはどうすればよいですか?

の前に来たナイーブコード、使用:event.Start> trial.Start & & event.Start < trial.End

しかしNodaTimeそれらの比較に変換するには、もはや有効ではありません。

EventとTrialの両方が、おそらくタイムゾーンタイプを使用しているサードパーティ製のライブラリか、OffsetDateTimesではなくインスタントであることを考慮して、インスタントとインターバルに変換する方法を前提にしても、 。

答えて

1

注:この回答は、「トライアルが完全にイベントを含む」ことを目的としています。「トライアルオーバーラップイベント」については、Matt Johnsonの答えを参照してください。

OffsetDateTime.ToInstantは曖昧ではないので、確かにInstantの値に変換することができます。 ...これの

Interval trial = new Interval(trial.Start.ToInstant(), trial.End.ToInstant()); 

if (trial.Contains(event.Start.ToInstant()) && 
    trial.Contains(event.End.ToInstant())) 
{ 
    ... 
} 

一つの潜在的シワが区間の終点が排他的であるということですので、event.Endtrial.Endは同じ瞬間、上記の意志であれば:あなたはしかし、裁判から間隔を作成することができますifステートメント本文を入力しないでください。

+0

乾杯ジョン、私は前のコードが右に同じ問題に遭遇しただろうと思いますか? –

+0

@RyanTheLeach:あなたは、あなたが最後の部分に使っていたものを見せていないので、知るのは難しいですが、潜在的にはいです。あなたは間違いなくそのようなエッジケースについて考える(そしてテストする)必要があります。 –

+0

@JonSkeet - これは、イベントの全長がトライアル内にあるかどうかをテストするだけです。おそらくそれはOPが望んでいたものですが、私の答えによると、実際には範囲が重複しているかどうかテストしたいと思っていたようです。 'Interters'の' IntersectsWith'や 'OverlapsWith'メソッドの良い例でしょうか? –

1

私が間違っているかもしれないが、あなたがtrialeventを重なった場合知りたいたようです。あなたの範囲は半開区間(包括開始、排他的で終了)していると仮定すると - あなたはとの重複をテストします:

if (trial.Start.ToInstant() < event.End.ToInstant() && 
    trial.End.ToInstant() > event.Start.ToInstant()) 
{ 
    ... 
} 
関連する問題