Как вы проверяете, лежат ли 2 OffsetDateTime в пределах других 2 OffsetDateTIme?

Учитывая событие POCO {OffsetDateTime Start, OffsetDateTime End} и пробную версию POCO {OffsetDateTime Start, OffsetDateTime End}

Где испытания обычно занимают часы, а события происходят в течение нескольких секунд.

Как я могу проверить, произошло ли Событие в Испытании?

Наивный код, который был раньше, использовал:

но при преобразовании в NodaTime эти сравнения больше недействительны.

Я подозреваю, что не могу не сделать некоторых предположений о том, как его следует преобразовать в мгновения и интервалы, учитывая, что и событие, и пробная версия исходят из сторонней библиотеки, которая, вероятно, должна использовать типы с часовым поясом или мгновения, а не OffsetDateTimes.


person Ryan The Leach    schedule 29.09.2017    source источник


Ответы (2)


Примечание: этот ответ нацелен на «испытание полностью содержит событие» - для «испытания перекрывает событие» см. Ответ Мэтта Джонсона.

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.

person Jon Skeet    schedule 29.09.2017
comment
Привет, Джон, я думаю, что предыдущий код столкнулся бы с теми же проблемами, верно? - person Ryan The Leach; 29.09.2017
comment
@RyanTheLeach: Ну, вы не показывали, что использовали для финальной части, так что это трудно понять, но потенциально да. Вы определенно хотите подумать о таких пограничных случаях (и протестировать их). - person Jon Skeet; 29.09.2017
comment
@JonSkeet — это проверяет только то, находится ли вся продолжительность события в пределах пробной версии. Возможно, это то, чего хотел ОП, но, похоже, им действительно нужен был тест на перекрывающиеся диапазоны, согласно моему ответу. Может быть, хороший случай для метода IntersectsWith или OverlapsWith на Interval? - person Matt Johnson-Pint; 30.09.2017
comment
@MattJohnson: У меня сложилось впечатление, что это было первое, но вы правы, что это неоднозначно. - person Jon Skeet; 30.09.2017

Я могу ошибаться, но, похоже, вы хотели знать, не перекрываются ли trial и event перекрываются. Предполагая, что ваши диапазоны представляют собой полуоткрытые интервалы (включительное начало, эксклюзивный конец), вы должны проверить перекрытие с помощью:

if (trial.Start.ToInstant() < event.End.ToInstant() &&
    trial.End.ToInstant() > event.Start.ToInstant())
{
    ...
}
person Matt Johnson-Pint    schedule 29.09.2017