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

Posted

技术标签:

【中文标题】C# - 在不同日期的 2 个 DateTime 对象之间搜索时间【英文标题】:C# - Searching Time between 2 DateTime Objects of different days 【发布时间】:2017-01-20 14:50:01 【问题描述】:

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

在每个事件中,我都将“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 发生或仍在发生的事件时 我应该得到这个事件。

有什么建议吗?

【问题讨论】:

所以您只想知道活动是否在任何一天覆盖 10 天?那就是你没有特定的DateTime 来检查? 请注意:将您的对象命名为其他名称。如果你把它放在 WinForms 应用程序中,“事件”很快就会变得混乱。尽量避免使用关键字作为对象名称。在我调用我的代码完成之前,如果我发现我使用了关键字作为对象名称,我总是先仔细阅读同义词库,即使大小写不同。“活动”在这里可能更适合您的目的。 @user1895086 感谢您的建议。 想指出,我是一名 .NET 学生,几乎没有 Java、C 和 C# 编程知识。我还没有接触到 LINQ。 【参考方案1】:

假设您有一个特定的时间想要确定事件是否涵盖,无论它涵盖的日期如何,那么您需要考虑 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)

【讨论】:

【参考方案2】:

假设你有一个

List<Event> Events;

您的Events。您可以使用简单的方法创建一个简单的 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;

【讨论】:

打败我,我的解决方案看起来几乎相同,我刷新了,这就是大声笑。 我不确定 OP 是否有特定的 DateTime 可以检查,只是他们想知道事件是否在任何一天的 10 点发生。 @juharr 是的,没什么特别的。我以 10:00 为例。 这是您需要@MichaelRoskin 的查询吗? 我实际上是一名 ASP.NET 学生,我们还没有使用 LINQ,所以这对我来说有点胡言乱语。有没有使用“基本”c#的解决方案?【参考方案3】:

在哪里试用 Linq:

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

【讨论】:

以上是关于C# - 在不同日期的 2 个 DateTime 对象之间搜索时间的主要内容,如果未能解决你的问题,请参考以下文章

c#如何计算两个日期之间相隔天数

Nullable-如何在 C# 中的 DateTime 类型中仅比较没有时间的日期?

C#中如何判断一个DateTime类型字段的日期为空?

转载 C#中日期类型DateTime的日期加减操作

如何在 C# 中将日期字符串转换为 DateTime 对象? [复制]

C# 计算两个日期的时间间隔