你如何检查 2 OffsetDateTime 是否位于另一个 2 OffsetDateTIme 之内?

How do you check if 2 OffsetDateTime lie within another 2 OffsetDateTIme?

给定一个 POCO 事件 {OffsetDateTime Start, OffsetDateTime End} 和一个 POCO 试验 {OffsetDateTime Start, OffsetDateTime End}

其中试验通常跨越数小时,事件发生在几秒钟内。

如何测试事件是否发生在试用版中?

之前的Naive代码,使用了:event.Start > trial.Start && event.Start < trial.End

但转换为 NodaTime 后,这些比较不再有效。

我怀疑我不能不对它应该如何转换为瞬间和间隔做出一些假设,考虑到 Event 和 Trial 都来自第三方库,可能应该使用时区类型或瞬间而不是偏移日期时间。

注意:此答案针对 "trial completely contains event" - "trial overlaps event",请参阅 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 语句体。

我可能是错的,但您似乎想知道 trialevent 是否重叠 。假设您的范围是半开区间(包括开始,不包括结束) - 那么您将测试重叠:

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