C# - 搜索不同日期的2个DateTime对象之间的时间

时间:2017-01-20 14:50:01

标签: c# datetime time between days

我有一个“事件”对象列表。

在每个事件中,我都将“EventStartTime”和“EventEndTime”声明为DateTime对象。

我希望能够按时间搜索“事件”,例如10:00, 你在下面看到的“事件”表明节日从2月17日22:00开始, 并且在第二天的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发生的事件时 我应该参加这个活动。

有什么建议吗?

3 个答案:

答案 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;

到你的档案。

编辑:如果没有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;
}

答案 1 :(得分:0)

尝试Linq其中:

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

答案 2 :(得分:0)

假设您有一个特定的时间,您想要确定该事件是否涵盖了它所涵盖的日期,那么您需要考虑4个案例。首先,如果日期相隔超过1天,则涵盖一天中的所有时间。如果开始时间是在一天中的时间之前,而结束时间是在一天中的时间之后,它将覆盖时间。最后两种情况要求结束日期是从开始日期开始的第二天,然后开始日期是在一天中的时间之前,或者结束日期是在一天中的时间之后。请注意,这也假设开始日期在结束日期之前。

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)