java 判断两个时间段是否重叠的案例
最近业务上遇到需要判断两个时间段是否存在重叠的情况,网上找了不少代码。大佬们的思路过于简洁了,有些理解不了。还只是个菜鸟码农,还是多锻炼锻炼自己的思路。
思路很简单:定义一个时间段的概念,既然是时间段就包含起始时间和终止时间这两个时间点。构造方法要保证起始时间在终止时间之前,这样才是一个有效的时间段概念。
为TimeSlot这个类定义四个比较先后顺序的方法,分别为:小于、大于、小于等于、大于等于。画张简单的时间线图理解一下就明白了。当整个时间段作为一个整体时,只有时间段小于或大于另一个时间段时,它们才没有重叠的交集。
代码如下,有什么错误还请各位看官帮忙指出
packagecom.abc.common.util; importlombok.Data; importorg.springframework.stereotype.Component; importjava.time.LocalDateTime; /** *日期工具类 **使用LocalDateTime存取或判断 *
*@seejava.time.LocalDateTime *@date2020-6-2910:20:42 */ @Component publicclassDateUtil{ /** *判断两个时间段是否重叠 *@paramslot1 *@paramslot2 *@return */ publicstaticbooleanoverlapped(TimeSlotslot1,TimeSlotslot2){ TimeSlotprevious,next; previous=slot1.startTime.isBefore(slot2.startTime)?slot1:slot2; next=slot2.startTime.isAfter(slot1.startTime)?slot2:slot1; //这里业务需要,允许时间点的重叠 //例如某个时间段的起始时间:2020-06-2900:00:00 //和另一个时间段的终止时间:2020-06-2900:00:00 //它们俩可以有交点。如果不需要这种逻辑只把le改成lt //,ge改成gt就可 return!(le(previous,next)||ge(previous,next)); } /** *构造一个时间段 *@paramstartTime *@paramendTime *@return */ publicstaticTimeSlotbuildSlot(LocalDateTimestartTime,LocalDateTimeendTime){ returnnewTimeSlot(startTime,endTime); } /** *lessequal *小于等于 *@paramprev *@paramnext *@return */ privatestaticbooleanle(TimeSlotprev,TimeSlotnext){ returnlt(prev,next)||next.endTime.isEqual(prev.startTime); } /** *greaterequal *大于等于 *@paramprev *@paramnext *@return */ privatestaticbooleange(TimeSlotprev,TimeSlotnext){ returngt(prev,next)||prev.endTime.isEqual(next.startTime); } /** *greaterthan *大于 *@paramprev *@paramnext *@return */ privatestaticbooleangt(TimeSlotprev,TimeSlotnext){ returnprev.endTime.isBefore(next.startTime); } /** *lessthan *小于 *@paramprev *@paramnext *@return */ privatestaticbooleanlt(TimeSlotprev,TimeSlotnext){ returnnext.endTime.isBefore(prev.startTime); } /** *时间段类 */ @Data staticclassTimeSlot{ privateLocalDateTimestartTime; privateLocalDateTimeendTime; publicTimeSlot(LocalDateTimestartTime,LocalDateTimeendTime){ if(startTime.isAfter(endTime)){ this.startTime=endTime; this.endTime=startTime; }else{ this.startTime=startTime; this.endTime=endTime; } } } }
在业务代码中调用:
//... if(DateUtil.overlapped( DateUtil.buildSlot(beginTime,endTime), DateUtil.buildSlot(beginTime1,endTime1) )){ //时间段有重叠,写下重叠情况的业务代码 } //...
当然也可以把TimeSlot这个类拎出来,那样或许更方便。
补充知识:Java计算Date类时间差的函数
我就废话不多说了,大家还是直接看代码吧~
publicstaticStringTimeDifference(longstart,longend){ longbetween=end-start; longday=between/(24*60*60*1000); longhour=(between/(60*60*1000)-day*24); longmin=((between/(60*1000))-day*24*60-hour*60); longs=(between/1000-day*24*60*60-hour*60*60-min*60); longms=(between-day*24*60*60*1000-hour*60*60*1000 -min*60*1000-s*1000); StringtimeDifference=day+"天"+hour+"小时"+min+"分"+s+"秒"+ms +"毫秒"; returntimeDifference; }
以上这篇java判断两个时间段是否重叠的案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。