中断可能从几分钟延长到多天。我将其存储在具有开始日期/时间和结束日期/时间的中断表中。在保存停机记录时,使用碳计算持续时间(以秒为单位)。
$outage->duration = $outage->start_time->diffInSeconds($outage->end_time, true);
我现在需要删除下午5点到早上7:59:59之间的任何时间(即工作时间以外),但我不知道从哪里开始并感谢任何帮助:)
答案 0 :(得分:1)
你可以做的是每1秒钟DatePeriod
(我认为这是关键业务,所以它必须是第二个)并检查每一秒是否在一天的营业时间内。如果是,则从总数中减去。
<?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