Если предположить, что у вас есть определенное время дня, когда вы хотите, чтобы определить, является ли обложки событий независимо от даты, когда он ее охватывает, тогда вам нужно рассмотреть 4 случая. Сначала, если даты более чем на один день, они охватывают все время дня. Если время начала до дня, а конец - по истечении времени суток, оно будет покрывать время. В двух последних случаях требуется, чтобы дата окончания была на следующий день с даты начала, либо дата начала до дня, либо дата окончания - после дня. Обратите внимание, что это также предполагает, что дата начала до даты окончания.
var events = new List<Tuple<DateTime, DateTime>>
{
// start and end after time of day but on different days
Tuple.Create(
new DateTime(2017, 02, 17, 22, 0, 0),
new DateTime(2017, 02, 18, 15, 0, 0)),
// start and end before time of day but on different days
Tuple.Create(
new DateTime(2017, 02, 17, 9, 0, 0),
new DateTime(2017, 02, 18, 7, 0, 0)),
// start before and end after same day
Tuple.Create(
new DateTime(2017, 02, 17, 9, 0, 0),
new DateTime(2017, 02, 17, 11, 0, 0)),
// covers more than 1 day
Tuple.Create(
new DateTime(2017, 02, 17, 22, 0, 0),
new DateTime(2017, 02, 18, 22, 0, 1)),
// start after and end before on different days
Tuple.Create(
new DateTime(2017, 02, 17, 22, 0, 0),
new DateTime(2017, 02, 18, 10, 0, 0)),
// start and end before on same day
Tuple.Create(
new DateTime(2017, 02, 17, 7, 0, 0),
new DateTime(2017, 02, 17, 8, 0, 0)),
// start and end after on same day
Tuple.Create(
new DateTime(2017, 02, 17, 11, 0, 0),
new DateTime(2017, 02, 17, 12, 0, 0)),
};
var timeOfDay = new TimeSpan(0, 10, 0 ,0);
foreach (var x in events)
{
if (x.Item2 - x.Item1 > TimeSpan.FromDays(1)
|| (x.Item1.TimeOfDay < timeOfDay && x.Item2.TimeOfDay > timeOfDay)
|| (x.Item1.Date < x.Item2.Date
&& (x.Item1.TimeOfDay < timeOfDay || x.Item2.TimeOfDay > timeOfDay)))
{
Console.WriteLine(x);
}
}
Выведет
(2/17/2017 10:00:00 PM, 2/18/2017 3:00:00 PM)
(2/17/2017 9:00:00 AM, 2/18/2017 7:00:00 AM)
(2/17/2017 9:00:00 AM, 2/17/2017 11:00:00 AM)
(2/17/2017 10:00:00 PM, 2/18/2017 10:00:01 PM)
Таким образом, вы просто хотите знать, если событие охватывает 10 в любой день? То есть у вас нет определенного «DateTime» для проверки? – juharr
Просто примечание: Назовите свой объект чем-то другим. Если вы поместите это в приложение WinForms, «Событие» будет запутываться быстро. Старайтесь избегать использования ключевых слов в качестве имен объектов. Прежде чем я когда-либо назову свой код, я всегда просматриваю тезаурус в первую очередь, если обнаруживаю, что я использовал ключевое слово в качестве имени объекта, даже если дело другое. «Активность» может быть лучше для ваших целей здесь. – CDove
@ user1895086 благодарит за хороший отзыв. –