/// <summary> /// 两个时间段,是否存在 时间上的重叠. /// </summary> /// <param name="trMain"> 时间段1 (算法中,把第一个参数的时间段,认为是已存在的数据) </param> /// <param name="trNew)"> 时间段2 (算法中,把第二个参数的时间段,认为是准备新增的数据) </param> /// <param name="straightFlag)"> 连续标志 (为 true 的时候, 10:00--12:00 与 12:00--14:00 认为是没有重叠的, 为 false 的时候,认为是在 12:00 上有重叠) </param> /// <returns></returns> public static bool IsExistsTimeRangeOverlap(TimeRange trMain, TimeRange trNew, bool straightFlag = true) { // 下面的注释中的字符说明: // - 表示 空白时间段 // + 表示 开始/结束的 标志位. // = 表示 时间段范围内 // 首先判断 第一种情况. // 时间段1:----------+=====+----- // 时间段2:--------+====+-------- // 或者 // 时间段1:----------+=====+----- // 时间段2:----------+====+-------- // 或者 // 时间段1:----------+=====+----- // 时间段2:--------+==========+-- // 或者 // 时间段1:----------+=====+----- // 时间段2:----------+==========+-- if (trNew.StartTime <= trMain.StartTime && trNew.EndTime > trMain.StartTime) { // 有重叠. return true; } // 然后判断第二种情况. // 时间段1:------+=========+----- // 时间段2:--------+====+-------- // 或者 // 时间段1:------+=========+----- // 时间段2:------+====+-------- // 或者 // 时间段1:------+=========+----- // 时间段2:--------+==========+-- // 或者 // 时间段1:------+=========+----- // 时间段2:------+==========+-- if (trNew.StartTime >= trMain.StartTime && trNew.StartTime < trMain.EndTime) { // 有重叠. return true; } // 最后判断连续的情况. // 第一种情况. // 时间段1:----------+=====+------------- // 时间段2:-----+====+-------- if (trNew.StartTime <= trMain.StartTime && trNew.EndTime == trMain.StartTime && !straightFlag) { // 时间连续,但是不允许连续 // 有重叠. return true; } // 第二种情况. // 时间段1:------+=========+------------- // 时间段2:----------------+====+-------- if (trNew.StartTime >= trMain.StartTime && trNew.StartTime == trMain.EndTime && !straightFlag) { // 时间连续,但是不允许连续 // 有重叠. return true; } // 如果执行到了这里,那么认为是 参数的2个时间段 没有重叠。 return false; }
public void IsExistsTimeRangeOverlapTestStraightFlag() { // 系统中已有的时间段为 10:00 -- 12:00 TimeRange trMain = new TimeRange(1000, 1200); bool actual; // 首先 8:00 -- 9:00 与 主数据 不存在时间重叠 actual = TimeRangeOverlapChecker.IsExistsTimeRangeOverlap( trMain, new TimeRange(800, 900)); // 不存在时间重叠. Assert.IsFalse(actual); // 允许连续的情况下 8:00 -- 10:00 与 主数据 不存在时间重叠 actual = TimeRangeOverlapChecker.IsExistsTimeRangeOverlap( trMain, new TimeRange(800, 1000)); // 不存在时间重叠. Assert.IsFalse(actual); // 允许连续的情况下 12:00 -- 14:00 与 主数据 不存在时间重叠 actual = TimeRangeOverlapChecker.IsExistsTimeRangeOverlap( trMain, new TimeRange(1200, 1400)); // 不存在时间重叠. Assert.IsFalse(actual); // 13:00 -- 14:00 与 主数据 不存在时间重叠 actual = TimeRangeOverlapChecker.IsExistsTimeRangeOverlap( trMain, new TimeRange(1300, 1400)); // 不存在时间重叠. Assert.IsFalse(actual); // 9:00 -- 11:00 与 主数据 存在时间重叠 actual = TimeRangeOverlapChecker.IsExistsTimeRangeOverlap( trMain, new TimeRange(900, 1100)); // 存在时间重叠. Assert.IsTrue(actual); // 9:00 -- 12:00 与 主数据 存在时间重叠 actual = TimeRangeOverlapChecker.IsExistsTimeRangeOverlap( trMain, new TimeRange(900, 1200)); // 存在时间重叠. Assert.IsTrue(actual); // 9:00 -- 13:00 与 主数据 存在时间重叠 actual = TimeRangeOverlapChecker.IsExistsTimeRangeOverlap( trMain, new TimeRange(900, 1300)); // 存在时间重叠. Assert.IsTrue(actual); // 10:00 -- 11:00 与 主数据 存在时间重叠 actual = TimeRangeOverlapChecker.IsExistsTimeRangeOverlap( trMain, new TimeRange(1000, 1100)); // 存在时间重叠. Assert.IsTrue(actual); // 10:00 -- 12:00 与 主数据 存在时间重叠 actual = TimeRangeOverlapChecker.IsExistsTimeRangeOverlap( trMain, new TimeRange(1000, 1200)); // 存在时间重叠. Assert.IsTrue(actual); // 10:00 -- 13:00 与 主数据 存在时间重叠 actual = TimeRangeOverlapChecker.IsExistsTimeRangeOverlap( trMain, new TimeRange(1000, 1300)); // 存在时间重叠. Assert.IsTrue(actual); }