使用PHP Carbon,删除两个时间段重叠的时间

时间:2017-10-01 00:34:58

标签: php mysql laravel php-carbon

中断可能从几分钟延长到多天。我将其存储在具有开始日期/时间和结束日期/时间的中断表中。在保存停机记录时,使用碳计算持续时间(以秒为单位)。

$outage->duration = $outage->start_time->diffInSeconds($outage->end_time, true);

我现在需要删除下午5点到早上7:59:59之间的任何时间(即工作时间以外),但我不知道从哪里开始并感谢任何帮助:)

1 个答案:

答案 0 :(得分:1)

你可以做的是每1秒钟DatePeriod(我认为这是关键业务,所以它必须是第二个)并检查每一秒是否在一天的营业时间内。如果是,则从总数中减去。

但是,这非常低效。例如,只需要一整天,您就必须进行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);

您没有提及周末是否适合您的工作日。如果是,只需检查迭代中的当前日期是星期六还是星期日,并减去所有这些秒数。

你可以在这里做很多优化(例如缓存一天),但它应该让你朝着正确的方向前进。

(我无法向您展示演示,因为我不能在典型的提供商中use Carbon