如何计算时间间隔(PHP)?

时间:2017-07-23 20:57:14

标签: php date datetime

我有工作时间,例如,从9:00到18:00

我有休息时间,例如,从13:00到14:00

我有一个忙碌的时间,例如,从15:00到18:00

如何在PHP中最有效地计算和显示客户空闲时间(9:00到13:00和14:00到15:00)?

也许最好的解决方案是将时间转换为unixtime,或使用关联数组,还是开始时间+持续时间?

2 个答案:

答案 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);