java里怎么判断时间重合_java 判断两个时间段是否重叠的案例

最近业务上遇到需要判断两个时间段是否存在重叠的情况,网上找了不少代码。大佬们的思路过于简洁了,有些理解不了。还只是个菜鸟码农,还是多锻炼锻炼自己的思路。

思路很简单:定义一个时间段的概念,既然是时间段就包含起始时间和终止时间这两个时间点。构造方法要保证起始时间在终止时间之前,这样才是一个有效的时间段概念。

为timeslot这个类定义四个比较先后顺序的方法,分别为:小于、大于、小于等于、大于等于。画张简单的时间线图理解一下就明白了。当整个时间段作为一个整体时,只有时间段小于或大于另一个时间段时,它们才没有重叠的交集。

代码如下,有什么错误还请各位看官帮忙指出

package com.abc.common.util;

import lombok.data;

import org.springframework.stereotype.component;

import java.time.localdatetime;

/**

* 日期工具类

*

* 使用localdatetime存取或判断

*

* @see java.time.localdatetime

* @date 2020-6-29 10:20:42

*/

@component

public class dateutil {

/**

* 判断两个时间段是否重叠

* @param slot1

* @param slot2

* @return

*/

public static boolean overlapped(timeslot slot1, timeslot slot2) {

timeslot previous, next;

previous = slot1.starttime.isbefore(slot2.starttime) ? slot1 : slot2;

next = slot2.starttime.isafter(slot1.starttime) ? slot2 : slot1;

// 这里业务需要,允许时间点的重叠

// 例如某个时间段的起始时间:2020-06-29 00:00:00

// 和另一个时间段的终止时间:2020-06-29 00:00:00

// 它们俩可以有交点。如果不需要这种逻辑只把le改成lt

// ,ge改成gt就可

return !(le(previous, next) || ge(previous, next));

}

/**

* 构造一个时间段

* @param starttime

* @param endtime

* @return

*/

public static timeslot buildslot(localdatetime starttime, localdatetime endtime) {

return new timeslot(starttime, endtime);

}

/**

* less equal

* 小于等于

* @param prev

* @param next

* @return

*/

private static boolean le(timeslot prev, timeslot next) {

return lt(prev, next) || next.endtime.isequal(prev.starttime);

}

/**

* greater equal

* 大于等于

* @param prev

* @param next

* @return

*/

private static boolean ge(timeslot prev, timeslot next) {

return gt(prev, next) || prev.endtime.isequal(next.starttime);

}

/**

* greater than

* 大于

* @param prev

* @param next

* @return

*/

private static boolean gt(timeslot prev, timeslot next) {

return prev.endtime.isbefore(next.starttime);

}

/**

* less than

* 小于

* @param prev

* @param next

* @return

*/

private static boolean lt(timeslot prev, timeslot next) {

return next.endtime.isbefore(prev.starttime);

}

/**

* 时间段类

*/

@data

static class timeslot{

private localdatetime starttime;

private localdatetime endtime;

public timeslot(localdatetime starttime, localdatetime endtime) {

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类时间差的函数

我就废话不多说了,大家还是直接看代码吧~

public static string timedifference(long start, long end) {

long between = end - start;

long day = between / (24 * 60 * 60 * 1000);

long hour = (between / (60 * 60 * 1000) - day * 24);

long min = ((between / (60 * 1000)) - day * 24 * 60 - hour * 60);

long s = (between / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);

long ms = (between - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000

- min * 60 * 1000 - s * 1000);

string timedifference = day + "天" + hour + "小时" + min + "分" + s + "秒" + ms

+ "毫秒";

return timedifference;

}

以上这篇java 判断两个时间段是否重叠的案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持萬仟网。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值