我有工作时间,例如,从9:00到18:00
我有休息时间,例如,从13:00到14:00
我有一个忙碌的时间,例如,从15:00到18:00
如何在PHP中最有效地计算和显示客户空闲时间(9:00到13:00和14:00到15:00)?
也许最好的解决方案是将时间转换为unixtime,或使用关联数组,还是开始时间+持续时间?
答案 0 :(得分:0)
使用PHP DateTime类。它提供了许多关于时间间隔算术的方法。参考:http://php.net/manual/en/book.datetime.php
答案 1 :(得分:0)
我将时间保持在同一天00:00以后的几分钟内。使用DateTime可能会有问题,因为它需要花一天的时间。
Time_in_minutes = Hour*60+minute.
这是一个(基本)算法,应该做你需要的。您必须对其进行优化,因为它假定计划中没有重叠项目:
<?php
class Interval {
// TODO: use getter/setters instead of public
public $from; // in minutes, included
public $to; // in minutes, excluded
public function __construct($from, $to) {
$this->from = $from;
$this->to = $to;
}
}
$intervals = array(new Interval(8*60, 18*60));
$schedule = array(
new Interval(13*60, 14*60),
new Interval(15*60, 18*60)
);
foreach( $schedule as $item ) {
foreach($intervals as $interval) {
// TODO: the algorithm assumes there are no overlapping items in the schedule
if ($interval->from <= $item->from && $interval->to >= $item->to) {
if ($interval->from == $item->from) {
$interval->from = $item->to;
} else if ($interval->to == $item->to) {
$interval->to = $item->from;
} else {
$intervals[] = new Interval($item->to, $interval->to);
$interval->to = $item->from;
}
break;
}
}
}
foreach($intervals as $interval)
echo sprintf("%02d:%02d-%02d:%02d\n", $interval->from / 60, $interval->from % 60,$interval->to / 60, $interval->to % 60);