Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Entfernen Sie mit PHP Carbon die Zeit in Sekunden, in der sich zwei Zeiträume überschneiden

Was Sie tun können, ist ein DatePeriod zu erstellen von 1-Sekunden-Intervallen (ich nehme an, das ist geschäftskritisch, also muss es auf die Sekunde genau sein) und prüfen Sie, ob jede Sekunde innerhalb der Geschäftszeiten des Tages liegt. Wenn ja, subtrahieren Sie es von der Gesamtsumme.

Dies ist jedoch schrecklich ineffizient. Zum Beispiel müssten Sie für einen ganzen Tag 86400 Schecks machen. Es wird schnell langsam . Vielleicht können Sie stattdessen ein 1-Minuten- oder sogar 1-Stunden-Intervall verwenden, wenn Ihre Geschäftsanforderungen dies zulassen, und einige Schätzungen vornehmen. Wie auch immer, so können Sie das tun:

<?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);

Sie erwähnen nicht, ob Wochenenden für Sie Werktage sind oder nicht. Wenn dies der Fall ist, überprüfen Sie einfach, ob der aktuelle Tag in der Iteration ein Samstag oder Sonntag ist, und subtrahieren Sie alle diese Sekunden.

Sie können hier viele Optimierungen vornehmen (z. B. den Tag zwischenspeichern), aber es sollte Sie in die richtige Richtung führen.

(Ich kann Ihnen keine Demo zeigen, weil ich Carbon nicht use Carbon kann bei den typischen Anbietern)