怎么判断两个日期区间是否重叠
如何判断两个日期区间是否重叠
问题:
假设有两个日期区间(StartDate, EndDate),其中,日期区间的开始时间与结束时间均可以为空。如果开始时间为空,则表示接近无限小;如果结束时间为空,则表示接近无线大。如何判断这两个日期区间是否发生重叠?
JS实现:
var a = { startDate : '', endDate : '' } var b = { startDate : '', endDate : '' } function isOverlapDate(dateRange_a, dateRange_b) { var a_startDate = dateRange_a.startDate == '' ? null : new Date(dateRange_a.startDate); var a_endDate = dateRange_a.endDate == '' ? null : new Date(dateRange_a.endDate); var b_startDate = dateRange_b.startDate == '' ? null : new Date(dateRange_b.startDate); var b_endDate = dateRange_b.endDate == '' ? null : new Date(dateRange_b.endDate); // A或者B的Start Date和End Date都为null,意味着A和B的日期接近无限小到无限大,则总会与另外一个日期区间重叠 if ((!a_startDate && !a_endDate) || (!b_startDate && !b_endDate)) { return true; } // 如果能够往下走,则意味着A或者B的某一个日期不为null if (!a_startDate) { // 若A的Start Date为空,意味着End Date一定不为空 // 在这种情况下,日期重叠有两种情况: // 1. B的Start Date为null // 2. B的Start Date不为null,A的End Date在B的Start Date之后 return !b_startDate || a_endDate >= b_startDate; } if (!a_endDate) { // 若A的End Date为空,意味着Start Date一定不为空 // 在这种情况下,日期重叠有两种情况: // 1. B的End Date为null // 2. B的End Date不为null,A的Start Date在B的End Date之前 return !b_endDate || a_startDate <= b_endDate; } // 能够往下走,则意味着A的Start Date和End Date肯定都不为null if (!b_startDate) { // 若B的Start Date为空,意味着End Date一定不为空 // 只要A的Start Date在B的End Date之前,两个日期一定重叠 return a_startDate <= b_endDate; } if (!b_endDate) { // 若B的End Date为空,意味着Start Date一定不为空 // 只要A的End Date在B的Start Date之后,两个日期一定重叠 return a_endDate >= b_startDate; } // 能够往下走,则意味着A和B的Start Date和End Date肯定都不为null return !(a_endDate < b_startDate || b_endDate < a_startDate); } console.log(a, b);