2017-01-20 1 views
1

У меня есть список объектов «событие».C# - Время поиска между 2 DateTime Объекты разных дней

В каждом случае у меня есть «EventStartTime» и «EventEndTime», объявленные как объекты DateTime.

Я хочу, чтобы иметь возможность искать «событие» по времени, например, 10:00, «Событие» вы видите ниже, показывает, что фестиваль начинается в 22:00 по фев 17, и концов в 15:00 на следующий день. У меня есть еще пара.

new EventsManager.Event() //3 
{ 
    EventType = EventsManager.EventType.Festival, 
    EventName = "Twistival", 
    EventPlace = placeList[4], 
    EventStartTime =new DateTime(2017,02,17,22,0,0), 
    EventEndTime = new DateTime(2017,02,18,15,0,0), 
    EventNumberOfParticipants = 8000 
}, 

Так что, когда я искать события, которые происходят, или по-прежнему происходит в в 10:00 я должен получить это событие.

любые предложения?

+0

Таким образом, вы просто хотите знать, если событие охватывает 10 в любой день? То есть у вас нет определенного «DateTime» для проверки? – juharr

+1

Просто примечание: Назовите свой объект чем-то другим. Если вы поместите это в приложение WinForms, «Событие» будет запутываться быстро. Старайтесь избегать использования ключевых слов в качестве имен объектов. Прежде чем я когда-либо назову свой код, я всегда просматриваю тезаурус в первую очередь, если обнаруживаю, что я использовал ключевое слово в качестве имени объекта, даже если дело другое. «Активность» может быть лучше для ваших целей здесь. – CDove

+0

@ user1895086 благодарит за хороший отзыв. –

ответ

0

Если предположить, что у вас есть определенное время дня, когда вы хотите, чтобы определить, является ли обложки событий независимо от даты, когда он ее охватывает, тогда вам нужно рассмотреть 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) 
+0

Ты бог среди мужчин. он отлично работает! –

1

Допустим, у вас есть

List<Event> Events; 

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

private IEnumerable<Event> GetRunningEvents(DateTime time) 
{ 
    return Events.Where(E => E.EventStartTime <= time && E.EventEndTime >= time); 
} 

Не забудьте добавить

using System.Linq; 

в файл.

EDIT: Без LINQ возможного подход

private List<Event> GetRunningEvents(DateTime time) 
{ 
    List<Event> RunningEvents = new List<Event>(); 
    foreach(Event E in Events) 
    { 
     if (E.EventStartTime <= time && E.EventEndTime >= time) 
     { 
      RunningEvents.Add(E); 
     } 
    } 
    return RunningEvents; 
} 
+0

Побей меня, мое решение выглядело почти идентично, и я освежился, и там это было lol. – CDove

+0

Я не уверен, что у OP есть определенная «DateTime», чтобы проверить, просто они хотят узнать, происходит ли событие в 10 в любой день. – juharr

+0

@juharr да, ничего конкретного. В качестве примера я использовал 10:00. –

0

Попробуйте Linq Где:

var list = new List<Event>(); 
var searchTime = DateTime.Now; 
var result = list.Where(e => e.EventStartTime <= searchTime && searchTime <= e.EventEndTime).ToList();