计算两个时间片段的重叠的时间
没有测试过,备忘记录
/**
* 计算两个时间片段的重叠的时间.
* @param a 第一个开始时间.
* @param b 第一个结束时间.
* @param x 第二个开始时间.
* @param y 第二个结束时间.
* @return 重叠的时间.
*/
public static Duration overlap(LocalDateTime a,
LocalDateTime b,
LocalDateTime x,
LocalDateTime y) {
// [a -- b]
// [x -- y]
// b < x 或者 y < a ,两个时间片没有重叠([a - b] -- [x - y] || [x -y] -- [a - b])
// 没有重叠.
if (b.isBefore(x) || y.isBefore(a)) {
return Duration.ZERO;
}
// 有重叠的情况
// 重叠开始时间 = 开始时间较靠后,重叠结束时间 = 结束时间靠前
// [a(11:00) -- b(12:00)]
// [x(11:30) -- y(12:30)] ==> [ x(11:30)(开始时间靠后) - b(12:00)(结束时间靠前) ] = 重叠时间
// [x(10:30) -- y(12:30)] ==> [ a(11:00)(开始时间靠后) - b(12:00)(结束时间靠前) ] = 重叠时间
// [x(10:30) -- y(11:30)] ==> [ a(11:00)(开始时间靠后) - y(11:30)(结束时间靠前) ] = 重叠时间
//
LocalDateTime overlapStart = a.isAfter(x) ? a : x;
LocalDateTime overlapEnd = b.isAfter(y) ? y : b;
return Duration.between(overlapStart, overlapEnd);
}