有这样一种场景:给定一个时间区间,需要判断这个时间区间属于哪些时间区间。例如,时间间隔范围如下:[["00:00","01:00"],["01:00","02:00"],["02:00","03":00"],["03:00","04:00"],["04:00","05:00"],["05:00","06:00"],["06:00","07:00"],["07:00","08:00"],["08:00","09:00"],["09:00","10:00"],["10:00","11:00"],["11:00","12:00"],["12:00","13:00"],["13:00""14:00"],["14:00","15:00"],["15:00","16:00"],["16:00","17:00"],["17:00","18:00"],["18:00","19:00"],["19:00","20:00"],["20:00","21:00"],["21:00","22:00"],["22:00","23:00"],["23:00","24:00"]]现在给定一个时间间隔10:15-16:38,那么需要返回["10:00","11:00"],["11:00","12:00"],["12:00","13:00"],["13:00","14:00"],["14:00","15:00"],["15:00","16:00"],["16:00","17:00"]这些时间段范围。1.常规时间区间判断假设给定时间区间为[st,et],时间范围为[t1,t2],则[t1,t2]范围内[st,et]的判断依据为如下情况:t1>=st&&t2<=et;st>=t1&&st<=t2;et>=t1&&et<=t2;再看给定时间间隔不在时间范围内,即[st,et]判断依据不在[t1,t2]范围内:s??tt2&&et>t2;从上面的判断依据来看,给定的时间区间不在时间范围内的判断依据就比较简单了,倒过来就可以得到正确的时间区间范围了。具体判断代码如下:functionjudge(startTime,endTime){//生成一个24小时的时间间隔,跨度为1小时lettimeArrays=newArray(24).fill(['','']).map((item,index)=>[(index<10?'0'+index:index)+':00',((index+1)<10?'0'+(index+1):(索引+1))+':00']);返回时间数组。过滤器(项目=>!((比较(项目[0],开始时间)&&比较(项目[0],结束时间))||(比较(开始时间,项目[1])&&比较(结束时间,项目[1]))));}函数比较(startTime,endTime){//将时间转换为分钟,然后比较letstartTimes=startTime.split(':');让endTimes=endTime.split(':');让startTimeVal=startTimes[0]*60+Number(startTimes[1]);让endTimeVal=endTimes[0]*60+Number(endTimes[1]);returnstartTimeVal>=endTimeVal;}我们来验证时间间隔10:15-16:38console.log(JSON.stringify(judge('10:15','16:38')))的输出如下:[["10:00","11:00"],["11:00","12:00"],["12:00","13:00"],["13:00","14:00"],["14:00","15:00"],["15:00","16:00"],["16:00","17:00"]]2.包含临界点的时间区间判断如果给定的时间区间包含临界时间点,比如10:00-17:00,那么结果如何呢?console.log(JSON.stringify(judge('10:00','17:00')))此时输出结果如下:[["10:00","11:00"],["11:00","12:00"],["12:00","13:00"],["13:00","14:00"],["14:00","15:00"],["15:00","16:00"],["16:00","17:00"]]在实际应用中,临界点时间可能有不同的规则,具体有以下三种场景:(1)两个同时计算时间间隔,如16:00,算作位于["15:00","16:00"]或["16:00","17:00"];(2)临界时间作为结束时间,如16:00,则只算在区间["15:00","16:00"]内;(3)临界时间作为开始时间,比如16:00,那么只算位于区间["16:00","17:00"];如果要同时满足以上三种场景,需要修改通过传入相应的参数来判断方法和控件,代码如下:functionjudge(startTime,endTime,leftEquals,rightEquals){//生成一个24小时的时间间隔,时间间隔为1小时lettimeArrays=newArray(24).fill(['','']).map((item,index)=>[(index<10?'0'+index:index)+':00',((指数+1)<10?'0'+(index+1):(index+1))+':00']);返回timeArrays.filter(item=>!((compare(item[0],startTime,leftEquals)&&compare(item[0],endTime,rightEquals))||(compare(startTime,item[1],leftEquals)&&compare(endTime,item[1],rightEquals))));}functioncompare(startTime,endTime,equals){//将时间转换为分钟,然后比较letstartTimes=startTime.split(':');让endTimes=endTime.split(':');让startTimeVal=startTimes[0]*60+Number(startTimes[1]);让endTimeVal=endTimes[0]*60+Number(endTimes[1]);返回等于?startTimeVal>=endTimeVal:startTimeVal>endTimeVal;}下面分别测试一下上面三种场景:场景一:两边都包含,因为是倒置的判断方式,所以两个参数都需要传falseconsole.log(JSON.stringify(judge('10:00','12:00',false,false)))输出结果如下:[["09:00","10:00"],["10:00","11:00"],["11:00","12:00"],["12:00","13:00"]]场景二:临界点作为结束时间console.log(JSON.stringify(judge('10:00','12:00',false,true)))输出结果如下:[["09:00","10:00"],["10:00","11:00"],["11:00","12:00"]]场景三:输出临界点为起始时间console.log(JSON.stringify(judge('10:00','12:00',true,false)))结果如下:[["10:00","11:00"],["11:00","12:00"],["12:00","13:00"]]3.时间间隔过0点的判断在上面讨论的两种情况下,没有考虑给定的时间间隔过0点的问题,即是,结束时间小于开始时间比如10:15-01:23,这种情况怎么处理?如果时间间隔超过0点,则表示有两个时间间隔,即10:15-24:00和00:00-01:23。此时对两个时间间隔进行判断,修改后的代码如下:functionjudge(startTime,endTime,leftEquals,rightEquals){//划分时间间隔,判断结束时间是否小于开始时间=比较(开始时间,结束时间,假)?[[startTime,'24:00'],['00:00',endTime]]:[[startTime,endTime]];//生成一个1小时跨度的24小时时间间隔lettimeArrays=newArray(24).fill(['','']).map((item,index)=>[(index<10?'0'+index:index)+':00',((index+1)<10?'0'+(index+1):(index+1))+':00']);返回timeArrays.filter(item=>targetTimes.some(target=>!((compare(item[0],target[0],leftEquals)&&compare(item[0],target[1],rightEquals))||(compare(target[0],item[1],leftEquals)&&compare(target[1],item[1],rightEquals))));}functioncompare(startTime,endTime,equals){//转换时间到分钟,然后比较letstartTimes=startTime.split(':');letendTimes=endTime.spl它(':');让startTimeVal=startTimes[0]*60+Number(startTimes[1]);让endTimeVal=endTimes[0]*60+Number(endTimes[1]);返回等于?startTimeVal>=endTimeVal:startTimeVal>endTimeVal;}让我们验证时??间间隔10:15-01:23console.log(JSON.stringify(judge('10:15','01:23',false,true)))输出结果如下[["00:00","01:00"],["01:00","02:00"],["10:00","11:00"],["11:00","12:00"],["12:00","13:00"],["13:00","14:00"],["14:00","15:00"],["15:00","16:00"],["16:00","17:00"],["17:00","18:00"],["18:00","19:00"],["19:00","20:00"],["20:00","21:00"],["21:00","22:00"],["22:00","23:00"],["23:00","24:00"]]