美文网首页PHP开发SQL极简教程 · MySQL · MyBatis · JPA 技术笔记 教程 总结PHP经验分享
常见需求:用户选择了一个时间段,如何判断这个时间段没有被别的用户

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

作者: 怀老师 | 来源:发表于2020-05-08 19:48 被阅读0次

    需求举例,设置每张图的展示时间段,设置完成后,后面再设置别的图的展示时间段时,要判断前面的设置,不能在同一时间段展示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!

    相关文章

      网友评论

        本文标题:常见需求:用户选择了一个时间段,如何判断这个时间段没有被别的用户

        本文链接:https://www.haomeiwen.com/subject/iyyqnhtx.html