判断一个时刻是否在一段时间之内(工具类方法)

判断一个时刻是否在一段时间之内(工具类方法)

   /**
     *
     * 判断一个时间点 是否在一个时间范围内
     * @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;
        }
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值