时间间隔重叠但在第二天

时间:2019-02-05 08:47:24

标签: c# datetime timespan

我正在尝试构建一个函数,该函数将告诉我2个时间范围是否重叠。到目前为止,我发现的所有现有解决方案都是关于检测重叠,但是在同一天,这对我不利。

我认为类似的方法可以工作,但不能解决所有情况:

var current = new Day()
{
    Start = TimeSpan.Parse("23:00"),
    End = TimeSpan.Parse("02:00")
};

var next = new Day()
{
    Start = TimeSpan.Parse("22:45"),
    End = TimeSpan.Parse("23:30")
};

current.End = (current.Start > current.End) ? 
               current.End.Add(new TimeSpan(24, 0, 0)) : 
               current.End;

next.End = (next.Start > next.End) ? 
            next.End.Add(new TimeSpan(24, 0, 0)) : 
            next.End;

bool overlap = (current.Start < next.End && next.Start < current.End);

Debug.WriteLine(overlap);

提供方案按预期工作,但如果我尝试以下操作,则不起作用:

var current = new Day()
{
    Start = TimeSpan.Parse("23:00"),
    End = TimeSpan.Parse("02:00")
};

var next = new Day()
{
    Start = TimeSpan.Parse("01:00"),
    End = TimeSpan.Parse("04:00")
};

关于我可以用来处理所有方案的任何建议。它需要处理重叠,但是还需要处理结束时间小于开始时间的任何时间,它会假定它是第二天,并且重叠计算应考虑到这一点。

谢谢。

1 个答案:

答案 0 :(得分:1)

您的class Day似乎是由2个TimeSpans定义的。

TimeSpan是时间长度,而不是时间点。考虑

class Range
{
    public DateTime Start { get; set; }
    public TimeSpan Length { get; set; }
}

您所有的要求都将变成孩子的游戏。

或者,您可以使用TimeSpan并保持日期独立,然后稍稍更改定义:使用“开始”(从午夜开始的偏移)和“长度”(从“开始”开始的偏移)。为了避免结束,否则必须大于24:00。对于TimeSpan来说不是问题,但使用起来并不是很自然。

var current = new Range()
{
    Start = TimeSpan.Parse("23:00"),
    //End = TimeSpan.Parse("02:00")
    Length = TimeSpan.Parse("03:00")  // (next day 2 AM) - (today 11 pm)
};

var next = new Range()
{
    Start = TimeSpan.Parse("22:45"),
    //End = TimeSpan.Parse("23:30")
    Length = TimeSpan.Parse("00:45")  // 23:30 - 22:45
};

bool Overlap(Range a, Range b)
{
   return ! ( (a.Start > (b.Start + b.Length) ) 
           || (b.Start > (a.Start + a.Length) ) );
}