我正在尝试构建一个函数,该函数将告诉我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")
};
关于我可以用来处理所有方案的任何建议。它需要处理重叠,但是还需要处理结束时间小于开始时间的任何时间,它会假定它是第二天,并且重叠计算应考虑到这一点。
谢谢。
答案 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) ) );
}