使用 PHP Carbon,删除两个时间段重叠的时间(以秒为单位)
Using PHP Carbon, remove time in seconds where two time periods overlap
中断的时间可能从几分钟到几天不等。我将其存储在具有开始 date/time 和结束 date/time 的中断 table 中。在保存中断记录时,使用 Carbon 计算持续时间(以秒为单位)。
$outage->duration = $outage->start_time->diffInSeconds($outage->end_time, true);
我现在需要删除下午 5 点到 7:59:59 上午(即非工作时间)之间的任何时间,但我不知道从哪里开始并感谢任何帮助:)
你可以做的是 DatePeriod
间隔 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);
你没有提到周末对你来说是不是工作日。如果是,只需检查迭代中的当前日期是星期六还是星期日,然后减去所有这些秒数。
您可以在此处进行很多优化(例如,缓存一天),但它应该让您朝着正确的方向前进。
(我无法向您展示演示,因为我无法在典型的提供商中 use Carbon
)
中断的时间可能从几分钟到几天不等。我将其存储在具有开始 date/time 和结束 date/time 的中断 table 中。在保存中断记录时,使用 Carbon 计算持续时间(以秒为单位)。
$outage->duration = $outage->start_time->diffInSeconds($outage->end_time, true);
我现在需要删除下午 5 点到 7:59:59 上午(即非工作时间)之间的任何时间,但我不知道从哪里开始并感谢任何帮助:)
你可以做的是 DatePeriod
间隔 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);
你没有提到周末对你来说是不是工作日。如果是,只需检查迭代中的当前日期是星期六还是星期日,然后减去所有这些秒数。
您可以在此处进行很多优化(例如,缓存一天),但它应该让您朝着正确的方向前进。
(我无法向您展示演示,因为我无法在典型的提供商中 use Carbon
)