【问题标题】:Checking for overlap between DateTime + TimeSpan检查 DateTime + TimeSpan 之间的重叠
【发布时间】:2018-12-07 18:29:08
【问题描述】:

我有 Appointment 这样的对象:

public Appointment(string p_Title, DateTime p_Start, TimeSpan p_Lenght)

我想检查对象是否重叠,但无论我尝试什么,我似乎都会在每个表示同一天的对象中得到重叠。我将 DateTime 格式化为 YYYY、MM、DD、HH:MM:SS。时间跨度为 HH:MM:SS

【问题讨论】:

  • 您能否详细说明重叠的含义?你想看看这两个日期是否相等?还是要检查两个对象是否相等?
  • 时间跨度只是时间的长度。这不是一天中的时间。使用距离作为类比。我们的跨度是 50 英尺,昨天我跑到我家附近的一个停车标志附近。我的路线是否与跨度重叠?
  • @Amy 那么问题是什么?时间跨度是约会的长度,而不是约会发生的时间。说我下午 2:30 有一个会议。明天一小时是一个完全明智的说法。
  • “无论我尝试什么” ...这些尝试是什么样的?
  • @Amy 是的,鉴于问题将时间跨度标记为p_Lenght 而不是p_TimeOfDay,我认为可以肯定地说OP 理解时间跨度是时间长度,不是一天中的某个时间。你断言他们认为这是一天中的某个时间的依据是什么?他们询问如何确定约会何时重叠,这意味着您有多组开始时间和长度。

标签: c# datetime


【解决方案1】:

我有 Appointment 这样的对象:
public Appointment(string p_Title, DateTime p_Start, TimeSpan p_Lenght)

所以每个约会都有一个DateTime的开始和一个TimeSpan的长度。
从这两个参数中,您可以通过使用DateTimeAdd 方法将p_Length 值添加到p_Start 值,轻松计算约会的结束时间,如下所示:

var end = p_Start.Add(p_Length);

计算完之后,每个约会都有两个 DateTime 值,因此很容易计算两个约会是否重叠 - 您只需测试一个在另一个结束之前开始,而另一个在一个结束之前开始(请注意,无论被测试的数据类型如何,这都是正确的,有关详细信息,请参阅overlap tag info)- 像这样:

bool AreOverlapping(Appointment a, Appointment b)
{
    return a.Start < b.Start.Add(b.Length) &&
           b.Start < a.Start.Add(a.Length)
}

如果您认为 13:00 结束的约会与 13:00 开始的另一个约会重叠,只需将 &lt; 更改为 &lt;=

我将 DateTime 格式化为 YYYY、MM、DD、HH:MM:SS。时间跨度为 HH:MM:SS

DateTime 也没有 TimeSpan 存储显示格式。只有它们的字符串表示可以 - 并且要检查重叠的约会,您不需要关心这些数据是如何表示为字符串的 - 您只关心数据本身。

【讨论】:

    【解决方案2】:

    这就是您在 C# 中为 List 执行 isOverlap() 的方式。建议时间的isOverlapisValid() 一起使用。对于一个或一组值的验证,您可以使用 timeOfDay 与它一起使用——或者,至少,这是我学会如何使用它的方式。

    private bool isOverlap(DateTime newStart, DateTime newEnd, DateTime existingStart, DateTime existingEnd)
    {
        return newStart < existingStart ? newEnd >= existingStart : newStart <= existingEnd;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多