आप क्या कर सकते हैं 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
विशिष्ट प्रदाताओं में)