できることは、DatePeriod
を作成することです 1秒間隔(これはビジネス上重要であると思いますので、秒単位である必要があります)で、1秒が1日の営業時間内であるかどうかを確認します。そうである場合は、合計から減算します。
ただし、これはひどく非効率的です。たとえば、1日だけ、86400回のチェックを行う必要があります。遅くなりますすばやく 。おそらく、ビジネス要件で許可されている場合は、代わりに1分または1時間の間隔を使用して、いくつかの見積もりを行うことができます。とにかく、これはあなたがこれを行う方法です:
<?php
use Carbon\Carbon;
$startTime = Carbon::create(2017, 9, 10, 8, 20, 0);
$endTime = Carbon::create(2017, 9, 10, 18, 35, 0);
$duration = $startTime->diffInSeconds($endTime, true);
$interval = new DateInterval("PT1S");
$period = new DatePeriod($startTime, $interval, $endTime);
$secondsToSubtract = 0;
foreach ($period as $second) {
$businessStart = clone $second;
$businessStart->setTime(8, 0); // start business day
$businessEnd = clone $second;
$businessEnd->setTime(17, 0); // end business day
if (!($second > $businessStart && $second < $businessEnd)) { // if the second is not a "business second", subtract it
$secondsToSubtract++;
}
}
var_dump($secondsToSubtract);
$realDuration = $duration - $secondsToSubtract;
var_dump($realDuration);
週末があなたにとって営業日であるかどうかについては言及しません。そうである場合は、反復の現在の日が土曜日か日曜日かを確認し、それらの秒をすべて減算します。
ここでは多くの最適化を行うことができますが(たとえば、1日をキャッシュするなど)、正しい方向に進むはずです。
(use Carbon
ため、デモを表示できません。 一般的なプロバイダーで)