0

我在显示列表时间时遇到问题。我在mysql中保存了开始时间、结束时间、间隔时间和阻塞时间。

例如

开始时间:09:00

结束时间:15:00

间隔:3

出块时间:10:00-11:00;13:00-14:00

static function getListTime($time_interval,$s_hour, $e_hour, $peakTimesConfig){
    switch ($time_interval) {
        case '1':
            $interval = new DateInterval('PT15M');
            break;
        case '2':
            $interval = new DateInterval('PT30M');
            break;
        case '3':
            $interval = new DateInterval('PT1H');
            break;
        case '4':
            $interval = new DateInterval('PT2H');
            break;
    }
    $result = array();
    $time = new DateTime($s_hour);
    $eTime = new DateTime($e_hour);
    $bookingTimeIntervalSecond = $time_interval * 60;
    $unavaibaleTimes = explode(';', $peakTimesConfig);
    $arrUnavaibaleTimes = [];
    foreach ($unavaibaleTimes as $unavaibaleTime) {
        $strTime = explode('-', $unavaibaleTime);
        $startTime = strtotime($strTime[0]);
        if (!isset($strTime[1])) {
            $endTime = $startTime + $bookingTimeIntervalSecond;
        } else {
            $endTime = strtotime($strTime[1]);
        }
        $arrUnavaibaleTimes[]=['startTime'=>$startTime,'endTime' => $endTime];
    }

    //sorting
    for($i = 0; $i < count($arrUnavaibaleTimes); $i ++) {
        for($j = 0; $j < count($arrUnavaibaleTimes); $j ++) {
            if ($arrUnavaibaleTimes[$i]['startTime'] < $arrUnavaibaleTimes[$j]['startTime']) {
                $sorting = $arrUnavaibaleTimes[$i];
                $arrUnavaibaleTimes[$i] = $arrUnavaibaleTimes[$j];
                $arrUnavaibaleTimes[$j]= $sorting;
            }
        }
    }

    $i = 0;
    while ($time < $eTime) {
        foreach($arrUnavaibaleTimes as $times){
            if ($time->getTimestamp() < $times['startTime'] || $time->getTimestamp() >= $times['endTime']) {
                if(!in_array($time->format("H:i"), $result)){

                    $result[] = $time->format("H:i");    
                }
            }
            else{
                break;
            }
        }
        $time->add($interval);
        $i++;
    }

    return $result;
}

我的问题是:我想在没有阻塞时间的情况下显示时间start timeend time

例如

结果 : 09:00, 11:00, 12:00, 14:00, 15:00

4

1 回答 1

0

就个人而言,我会class用类似下面的东西来做到这一点。注意:对数据的错误检查很少。您需要测试垃圾输入。

将显示以下类:

09:00, 11:00, 12:00, 14:00, 15:00

start将值更改为09:15当前会呈现以下内容,这可能不是您想要的结果,但这是我想要的:

09:15, 11:00, 12:00, 14:00, 15:00

并更改start10:00渲染:

11:00, 12:00, 14:00, 15:00

最后一个测试,更改interval2

09:00, 09:30, 11:00, 11:30, 12:00, 12:30, 14:00, 14:30, 15:00

编码:

// This would be from your mysql.
$raw = array(
    'start'=>'09:00',
    'end'=>'15:00',
    'interval'=>3,
    'block'=>'10:00-11:00;13:00-14:00'
    );

$ts = new TimeSlot($raw);
echo 'Result: '.$ts->result();

// Note: Very little error checking on the input data!
class TimeSlot {
    private $interval = 60;
    private $block = null;
    private $start = null;
    private $end = null;
    public function __construct($data=null) {
        if ($data) {
            if ($data['interval']) {
                $this->setInterval($data['interval']);
            }
            if ($data['block']) {
                $this->setBlock($data['block']);
            }
            if ($data['start']) {
                $this->setStart($data['start']);
            }
            if ($data['end']) {
                $this->setEnd($data['end']);
            }
        }
    }
    public function result() {
        $result = null;
        if (($this->start) && ($this->end)) {
            $t = explode(':',$this->start);
            $hs = $t[0];
            $ms = $t[1];
            do {
                $t = $hs.':'.str_pad($ms,2,'0');
                if (! $this->block[$t]) {
                    $result .= $t.', ';
                }
                $ms += $this->interval;
                if ($ms >= 60) {
                    $ms = 0;
                    $hs++;
                }
            } while($t != $this->end);
        }
        return (strlen($result) > 5) ? substr($result,0,-2) : $result;
    }
    private function setInterval($interval) {
        switch($interval) {
            case 1:
                $this->interval = 15;
                break;
            case 2:
                $this->interval = 30;
                break;
            case 4:
                // you would need to code for this option
                $this->interval = 120;
                break;
            default:
                $this->interval = 60;
        }
    }
    private function setBlock($block) {
        if ($block) {
            $tmp = explode(';',$block);
            foreach($tmp as $k=>$v) {
                $b = explode('-',$v);
                if (is_array($b)){
                    $ts = explode(':',$b[0]);
                    $hs = $ts[0];
                    $ms = $ts[1];
                    $n = $b[0];
                    do {
                        $t = $n;
                        $this->block[$t] = $t;
                        $ms += 15;
                        if ($ms >= 60) {
                            $ms = 0;
                            $hs++;
                        }
                        $n = $hs.':'.str_pad($ms,2,'0');
                    } while ($n != $b[1]);
                }
            }
        }
    }
    // no error check at all!
    private function setStart($start) {
        $this->start = $start;
    }
    // no error check at all!
    private function setEnd($end) {
        $this->end = $end;
    }
}
于 2018-05-11T12:12:23.300 回答