【问题标题】:PHP - Calcute unavailable hours in a calendar/agendaPHP - 计算日历/议程中的可用时间
【发布时间】:2010-12-03 15:35:20
【问题描述】:

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

我有一个 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)的使用时间。

最后,这告诉我酒店必须付钱给某人检查房间以防有人出现问题。

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

【问题讨论】:

  • 简单地说,你需要做一些间隔的重聚。
  • @ajreal - 谢谢,但我的数据已经是日期格式。我的问题是如何处理这些数据。

标签: php datetime


【解决方案1】:

算法大纲:

  1. 按开始时间排序。
  2. 穿过它们并加入相交的邻居。相交条件将是第二个区间的开始时间早于或等于第一个区间的结束时间。由于需要排序,因此只需要一个循环。
  3. 此时您只有不相交的区间,您可以将它们的跨度相加得到总跨度。

这是该算法的一个实现:

<?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);
?>

【讨论】:

  • 我会试一试,但我期待为第 2 步找到一些东西...谢谢!
【解决方案2】:

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

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

  1. 订购房间(时间跨度)。每次请求发生时,它都必须检查可用的时间跨度。
  2. 检查单元格(时间跨度)后,时间跨度将不再可用。

要订购房间,只需选择小时(00 到 23)和季度(00; 15; 30; 45;)

对于 ISP 业务,它对我来说非常有效。我认为酒店没有什么不同。因为时间跨度的概念是一样的。

当然,如果你根本不想编写代码,你可以找一些类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-08
    • 2013-06-02
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    相关资源
    最近更新 更多