判断一个时刻是否在一段时间之内(工具类方法)
/**
*
* 判断一个时间点 是否在一个时间范围内
* @Author yeafel 2019-07-24 (若有bug,欢迎指正!)
* @param currentDate 当前时间
* @param startTime 开始时间
* @param endTime 结束时间
* @return
*/
public static Boolean isInDateRange(Date currentDate, Date startTime, Date endTime) {
if (currentDate == null || startTime == null || endTime == null) {
//此处我不希望抛异常使程序终止
return false;
}
//帮助文档:compareTo()方法的返回值,date1小于date2返回-1,date1大于date2返回1,相等返回0
if (currentDate.compareTo(startTime) < 0) {
//当前时间 < 开始时间
return false;
} else if (currentDate.compareTo(endTime) > 0) {
//当前时间 > 结束时间
return false;
} else {
//其他情况则在时间范围内
return true;
}
}
可以看到用Date的compareTo()方法去实现是要不了几行代码的,很明显我的参数都是java的Date类型,因为我数据库是datetime,实体是java的Date类型,我想即使是时间字符串转成Date再调用该方法也十分方便。
2021-08-19更新:
已经对以上代码进行了更新,可以传入端点开闭参数,不传默认左闭右闭。Assert.notNull是第三方工具判空,大家也可以自己去判空做自己的处理即可。↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
/**
*
* 判断一个时间点 是否在一个时间范围内,可以分别选择两个端点值是否有效 (如: 左闭右闭(默认)、左开右闭、左闭右开、左开右开)
* 参考帮助文档:compareTo()方法的返回值,date1小于date2返回-1,date1大于date2返回1,相等返回0
* @Author yeafel 2021-08-19 (若有bug,欢迎指正!)
* @param sourceDate {@link Date} 被比较判断的日期
* @param startTime {@link Date} 开始时间
* @param endTime {@link Date} 结束时间
* @param endPoints {@link Boolean} 可传1个、2个 Boolean类型的参数,下标位0为左端点,下标位1为右端点
* 也可不传,不传默认两个端点都会被判断为有效范围,
* 也可只传一个左端点,那么右端点默认为true(不建议只传一个参数)。
* 推荐传参: 如果要传参,最好两个端点都传值,便于自己以后阅读代码。 --yeafel
* @return
*/
public static Boolean isInDateRange(Date sourceDate, Date startTime, Date endTime, Boolean... endPoints) {
Assert.notNull(sourceDate, "sourceDate can not be null !");
Assert.notNull(startTime, "startTime can not be null !");
Assert.notNull(endTime, "endTime can not be null !");
boolean leftEndpoint;
boolean rightEndpoint;
if (endPoints.length == 0) {
leftEndpoint = true;
rightEndpoint = true;
}else if (endPoints.length == 1){
leftEndpoint = endPoints[0];
rightEndpoint = true;
} else {
//无论是正好传两个参数,还是超过两个参数,都只有前两个参数有效.
leftEndpoint = endPoints[0];
rightEndpoint = endPoints[1];
}
//场景一: leftEndpoint和rightEndpoint都为true (左闭右闭)
if (leftEndpoint && rightEndpoint) {
if (sourceDate.compareTo(startTime) < 0) {
//sourceDate < 开始时间
return false;
} else {
// 开始时间 <= sourceDate <= 结束时间 为true,否则为false
return sourceDate.compareTo(endTime) <= 0;
}
} else if (!leftEndpoint && rightEndpoint) {
//场景二: 左开右闭
return sourceDate.compareTo(startTime) > 0 && sourceDate.compareTo(endTime) <= 0;
} else if (leftEndpoint) {
//场景三: 左闭右开
return sourceDate.compareTo(startTime) >= 0 && sourceDate.compareTo(endTime) < 0;
} else {
//场景四: 左开右开
return sourceDate.compareTo(startTime) > 0 && sourceDate.compareTo(endTime) < 0;
}
}