【study】两段时间取交集

398 阅读2分钟
  1. 当天零点时间戳
const todayStart = new Date(new Date().toLocaleDateString()).getTime();

2.当天二十三点五十九分时间戳

const todayEnd = new Date(new Date().toLocaleDateString()).getTime() + 24 * 60 * 60 * 1000 - 1;

3.当周日二十三点五十九分点时间戳

function getWeekEnd() {
     const now = new Date();
     const day = now.getDay() === 0 ? 7 : now.getDay();
     return todayEnd + ((7 - day) * 24 * 60 * 60 * 1000);
}
const weekEnd = getWeekEnd();

4.两段时间取交集

  • 背景:有这么一段时间,他是可以自动搜索的,即el-date-picker有开始和结束时间这种(如下图),每次点击搜索的时间,需要和四个不同的时间段进行对比
// 四个不同的时间段
过往时间: start1: 0end1:当天零点时间戳   // const todayStart = new Date(new Date().toLocaleDateString()).getTime();

今日截止时间: start2: 当天零点时间戳,   end2: 当天二十三点五十九分时间戳 // const todayEnd = new Date(new Date().toLocaleDateString()).getTime() + 24 * 60 * 60 * 1000 - 1;

本周截止时间: start3:当天二十三点五十九分时间戳  end3: 当周日二十三点五十九分点时间戳

未来时间: start4: 当周日二十三点五十九分点时间戳    end4: 0

image.png

5.判断

        // 第一、二种情况: 
        var start1 = 1667750400000 // 2022-11-07
        var end1 = 1668614400000 // 2022-11-17


        var start2 = 1667232000000 // 2022-11-01
        var end2 = 1668873600000 // 2022-11-20


        // 第三种情况:

        // var start1 = 1667232000000 // 2022-11-01
        // var end1 = 1668873600000 // 2022-11-20

        // var start2 = 1667750400000 // 2022-11-07
        // var end2 = 1668614400000 // 2022-11-17
        
        
        var myStart = undefined
        var myEnd = undefined
        
     function intersection(start1, end1, start2, end2) {
            if (start1 >= start2 && start1 <= end2) {
                myStart = start1 >= start2 ? start1 : start2;
                myEnd = end1 >= end2 ? end2 : end1;
                console.log(myStart, myEnd, '111111111111');
                return true;
            } else if (end1 >= start2 && end1 <= end2) {
                myStart = start1 >= start2 ? start1 : start2;
                myEnd = end1 >= end2 ? end2 : end1;
                console.log(myStart, myEnd, '2222222222222');
                return true;
            } else if (start1 <= start2 && end1 >= end2) {
                myStart = start1 >= start2 ? start1 : start2;
                myEnd = end1 >= end2 ? end2 : end1;
                console.log(myStart, myEnd, '333333333333');
                return true;
            } else {
                myStart = '无';
                myEnd = '无';
                console.log(myStart, myEnd, '44444444444');
                return false;
            }
        }
        console.log(intersection(start1, end1, start2, end2));

5.换一种思路,区间取大小值

  • 需要对比的两段时间,开始start进行对比,取最大值max
  • 结束时间进行对比,取最小值
  if (reqParams.deadlineStart && reqParams.deadlineEnd) {
                const start = Math.max(scheduledEndTimeStart, reqParams.deadlineStart);
                let end;  // 第四个区间end无穷大的时候,是0,需要特殊处理一下
                if (scheduledEndTimeEnd === 0) {
                    end = reqParams.deadlineEnd;
                } else {
                    end = Math.min(scheduledEndTimeEnd, reqParams.deadlineEnd);
                }
                if (start > end) {  // 此时表示没有交集
                    scheduledEndTimeStart = '';
                    scheduledEndTimeEnd = '';
                } else if (start <= end) {  // 此时有交集
                    scheduledEndTimeStart = start;
                    scheduledEndTimeEnd = end;
                }

                delete reqParams.deadlineStart;
                delete reqParams.deadlineEnd;
            }