使用PHP Carbon,删除两个时间段重叠的时间(以秒为单位)

使用PHP Carbon,删除两个时间段重叠的时间(以秒为单位),php,mysql,laravel,php-carbon,Php,Mysql,Laravel,Php Carbon,停机时间从几分钟到几天不等。我将其存储在具有开始日期/时间和结束日期/时间的停机表中。保存大修记录时,使用碳计算持续时间(秒) $outage->duration = $outage->start_time->diffInSeconds($outage->end_time, true); 我现在需要删除从下午5点到早上7:59:59之间的任何时间(即工作时间以外),但我不知道从何处开始,也不感谢任何帮助:)您可以做的是将日期周期设置为1秒间隔(我假设这是业务关键,因此必

停机时间从几分钟到几天不等。我将其存储在具有开始日期/时间和结束日期/时间的停机表中。保存大修记录时,使用碳计算持续时间(秒)

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

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

您可以做的是将
日期周期设置为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);

既然您有
mysql
标记,我相信您想从表中删除记录,对吗?你是在用雄辩还是其他什么来作为ORM?我在用雄辩。我希望填充另一个列,即“营业时间持续时间”列和“持续时间”列。我使用了mysql标签,以防有一个函数可以在那里使用(虽然这不是我的第一选择)。非常感谢。我现在要试一试:)@kerrin让我知道进展如何!太好了,谢谢:)我加了周末支票,到目前为止一切都很好。我会做更多的测试,但我认为这是一个赢家!非常感谢。