你如何检查 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.End
和 trial.End
是同一时刻,上面将不会进入 if
语句体。
我可能是错的,但您似乎想知道 trial
和 event
是否重叠 。假设您的范围是半开区间(包括开始,不包括结束) - 那么您将测试重叠:
if (trial.Start.ToInstant() < event.End.ToInstant() &&
trial.End.ToInstant() > event.Start.ToInstant())
{
...
}
给定一个 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.End
和 trial.End
是同一时刻,上面将不会进入 if
语句体。
我可能是错的,但您似乎想知道 trial
和 event
是否重叠 。假设您的范围是半开区间(包括开始,不包括结束) - 那么您将测试重叠:
if (trial.Start.ToInstant() < event.End.ToInstant() &&
trial.End.ToInstant() > event.Start.ToInstant())
{
...
}