[英]Using PHP Carbon, remove time in seconds where two time periods overlap
中斷可能從幾分鍾到幾天不等。 我將其存儲在具有開始日期/時間和結束日期/時間的中斷表中。 在保存中斷記錄時,使用 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
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.