の形式でいくつかの日付範囲がありDateTime $begin, DateTime $end
ます。これらの範囲は、あらゆる方法で重複できます。
|-------|
|=======|
|------|
|======|
|------------|
|=======|
|---|
等
私がやろうとしているDateInterval
のは、最初の範囲の開始から最新の範囲の終わりまで (上記の場合は 4 番目) の範囲の長さ (秒または ) を取得することです。
範囲が 2 つしかない場合は問題ありませんが、範囲を 2 つ以上に拡張する方法がわかりません。
編集:
class Range {
public DateTime $begin;
public DateTime $end;
}
$ranges = getRanges(); # function that returns array of Range objects
function getActiveHours($_ranges = array()) {
$sum = 0;
# this is the function I'd like to have
return $sum;
}
DateInterval
2 つの範囲に対してのみ、オブジェクトを返す関数があります。
function addTimeRanges(DateTime $b1, DateTime $e1, DateTime $b2, DateTime $e2) {
$res = null;
if ($e1 < $b2 || $e2 < $b1) { # separate ranges
$r1 = $b1->diff($e1);
$r2 = $b2->diff($e2);
$res = addIntervals($r1, $r2);
} else if ($b1 <= $b2 && $e1 >= $e2) { # first range includes second
$res = $b1->diff($e1);
} else if ($b1 > $b2 && $e1 < $e2) { # second range includes first
$res = $b2->diff($e2);
} else if ($b1 < $b2 && $e1 <= $e2 && $b2 <= $e1) { # partial intersection
$res = $b1->diff($e2);
} else if ($b2 < $b1 && $e2 <= $e1 && $b1 <= $e2) { # partial intersection
$res = $b2->diff($e1);
}
return $res;
}
whereは、2 つのオブジェクトの合計を別のオブジェクトとしてaddIntervals
返す関数です。DateInterval
DateInterval
これはいくつかの基本的なバージョンです。私の製品コードでは、他の多くの無関係なものを使用しています。
簡単にするために、次の時間部分のみがあるとしましょうDateTime
: ('06:00:00' から '08:00:00'), ('07:00:00' から '09:00:00'), ('06 :00:00', '08:00:00'), ('11:00:00' から '12:00:00') (このような範囲はたくさんあります)。今欲しい結果は4時間(6時から9時+11時から12時)です。