2017-09-29 34 views
0

給定一個POCO事件{OffsetDateTime開始,OffsetDateTime結束}和POCO試用{OffsetDateTime開始,OffsetDateTime結束}如何檢查2 OffsetDateTime是否在另一個2 OffsetDateTIme內?

在哪裏審判典型跨度小時,事件發生在幾秒鐘。

如何測試某個事件是否在試用期內發生?

它以前天真的代碼,用於:event.Start> trial.Start & & event.Start < trial.End

,但轉換爲NodaTime這些比較都不再有效。

我懷疑我不能不假設它應該如何轉換爲瞬間和間隔,考慮到事件和試驗來自第三方庫,應該可能使用時間分類類型,或瞬間而不是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想要的,但似乎他們實際上想要測試重疊範圍,根據我的答案。 'Interval'上的'IntersectsWith'或'OverlapsWith'方法可能是一個很好的例子嗎? –

1

我可能是錯的,但它似乎你想知道如果trialevent重疊。假設你的範圍是半開區間(包含起始,結束獨家) - 那麼你會測試與重疊:

if (trial.Start.ToInstant() < event.End.ToInstant() && 
    trial.End.ToInstant() > event.Start.ToInstant()) 
{ 
    ... 
} 
相關問題