PHP - 计算日历/议程中的可用小时数

时间:2010-12-03 15:35:21

标签: php datetime

我有一个似乎很难解决的问题所以我希望有人能为我找到一个好的解决方案:)

我有一个PHP程序,其中包含酒店许多会议室的预订列表。我需要计算一天中至少有1个会议室正在使用的时间。

这是一个例子:

Room 1: 10h 00 to 13h 00  
Room 2: 11h 00 to 14h 00  
Room 3: 15h 00 to 16h 00  

有了这些数字,我需要计算酒店在5小时内使用(10h到14h和15h到16h)。

最后,这告诉我酒店必须支付多少小时来检查房间,以防有人遇到问题。

如果你没有可以帮助我的库,算法可能是一个好的开始。

2 个答案:

答案 0 :(得分:2)

算法大纲:

  1. 按开始时间顺序排列。
  2. 浏览它们并加入相交的邻居。交叉条件是第二个区间的开始时间在第一个区间的结束时间之前或之前。由于订购,只需要一个循环。
  3. 此时你只有不相交的间隔,你可以总结他们的跨度以获得总跨度。
  4. 以下是该算法的实现:

    <?php
    // assuming hh:mm format for all the dates //
    $intervals = array(
        array(
            'start' => '15:30',
            'end' => '16:00',
        ),
        array(
            'start' => '10:00',
            'end' => '13:00',
        ),
        array(
            'start' => '15:00',
            'end' => '16:09',
        ),
        array(
            'start' => '11:00',
            'end' => '14:00',
        ),
    );
    
    // 1. sort the intervals by start date //
    function mySortIntervals($a, $b){
        return $a > $b;
    }
    usort($intervals, 'mySortIntervals');
    
    // 2. merge adjoining intervals //
    $active = 0;
    $current = 1;
    $length = count($intervals);
    while($current < $length){
        if($intervals[ $current ]['start'] <= $intervals[ $active ]['end']){
            $intervals[ $active ]['end'] = max($intervals[ $active ]['end'], $intervals[ $current ]['end']);
            unset($intervals[ $current ]);
        }
        else{
            $active = $current;
        }
        $current++;
    }
    
    // 3. cout the total time //
    $time = 0;
    foreach($intervals as $interval){
        $time += strtotime($interval['end']) - strtotime($interval['start']);
    }
    
    // output //
    echo str_pad((int) ($time/60/60), 2, '0', STR_PAD_LEFT).':';
    echo str_pad((int) (($time/60)%60), 2, '0', STR_PAD_LEFT);
    ?>
    

答案 1 :(得分:0)

首先,您需要定义间隔或时间跨度,例如每15分钟。 为什么这个?因为你需要控制因时间之前完成的房间造成的间隙,或者出于其他原因。

时间跨度不能超过15分钟。(时间就是金钱)。

  1. 订购房间(时间跨度)。每次请求发生时都必须检查可用的时间跨度。
  2. 检查单元格(时间跨度)后,时间跨度将不再可用。
  3. 要订购房间,只需选择小时(00至23)和季度(00; 15; 30; 45;)

    对于ISP业务来说,这对我很有帮助。我觉得酒店并没有什么不同。因为时间跨度的想法是一样的。

    但是,如果你根本不想编写代码,你当然可以寻找一些课程。