簡體   English   中英

使用 PHP Carbon,以秒為單位刪除兩個時間段重疊的時間

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM