常见需求:用户选择了一个时间段,如何判断这个时间段没有被别的用户占用呢?

需求举例,设置每张图的展示时间段,设置完成后,后面再设置别的图的展示时间段时,要判断前面的设置,不能在同一时间段展示2张图。

数据库字段

id,start_time,end_time,extra

判断逻辑(不漏判,不误杀)

1: 起始值在不在时间范围内。
2: 结束值在不在时间范围内。
3:已存在的时间范围在不在新的时间范围内(如果用户的起始值小于起始值,用户的结束值大于结束值,就囊括了前面的范围,还是重复了)

具体实现代码

     //校验时间是否被占用
    public function checkTime($aTime){
        //查询到当前数据库设置的所有时间
        $category = DB::table('img')->get(['start_time', 'end_time'])->toArray();//从数据库取出数据
        $aCategory = $this->objToArr($category);//自定义的数据对象转数组方法,方便遍历,这里也可以不转,foreach里用对象的方法取就行
        $aTime['start_time'] = strtotime($aTime['start_time']);
        $aTime['end_time'] = strtotime($aTime['end_time']);
        foreach ($aCategory as $v){
                $start_time = strtotime($v['start_time']);
                $end_time = strtotime($v['end_time']);
                //起始值在时间范围内
                if($aTime['start_time'] >= $start_time && $aTime['start_time'] <= $end_time){
                    return false;
                }

                //结束值在时间范围内
                if($aTime['end_time'] >= $start_time && $aTime['end_time'] <= $end_time){
                    return false;
                }

                //时间范围值超出当前的时间范围
                if($aTime['start_time'] < $start_time && $aTime['end_time'] > $end_time){
                    return false;
                }
        }

        return true;
    }

另一种思路

就是说,比如0-24点。 如果 [3点- 4点],[8点 – 10点]已经被占用了,成为了非法时间段。那就有[0点 – 3点],[4点 – 8点],[10点 – 24点]这三个时间段是合法的可以用的.有了[0点 – 3点],[4点 – 8点],[10点 – 24点]这三个合法时间段,遍历一下,看起始时间在哪个时间段内。比如,如果在 [4点 – 8点] 时间段内,那结束时间也得在这个时间段内,那才能是合法的时间段。

方法不是一成不变,不同的写法都有不同的业务场景。
enjoy it!

打赏作者

发表评论

电子邮件地址不会被公开。