الفرق بين 2 تواريخ في دقائق باستثناء عطلات نهاية الأسبوع والعطلات

StackOverflow https://stackoverflow.com//questions/23011869

سؤال

أنا بالنسبة إلى برمجة PHP الجديدة وتشغيل مشكلة مثيرة للاهتمام.لقد جربت عمليات بحث متعددة ووجدت حلولا مختلفة، ولكن لا يناسب أي منها مشكلتي الدقيقة.

لدي 2 datestamps بتنسيق mysql (2014-04-10 09:00:00 على سبيل المثال).أحتاج إلى معرفة الفرق بالدقائق بين الطائرات الزمنية 2، ولكن يجب استبعاد ساعات العمل الخارجية وعطلات نهاية الأسبوع والأعياد.

على سبيل المثال، طابع زمني اليوم (2014-04-11 14:00:00) و زمني الاثنين (2014-04-14 11:00:00) يجب أن تظهر نتيجة قدرها 390 دقيقة (أيام العمل08.30 إلى 18.00).

جميع الحلول على stackexchange تظهر النتائج كساعات أو أيام، لكنني بحاجة إلى مزيد من الدقة.

شكرا مقدما والاعتذار هناك شيء غير واضح.

هل كانت مفيدة؟

المحلول

استخدام مثال:

giveacodicetagpre.

الإخراج:

giveacodicetagpre.

وظيفة:

giveacodicetagpre.

هذه الوظيفة يمكن أن تكون أقصر / أفضل؛ولكن هذا هو عملك الآن؛)

إذا كنت ترغب في استبعاد أيام العطل، راجع هذا المثال: https://stackoverflow.com/a/19221403/67332HO>

نصائح أخرى

I got the answer from here

For PHP >= 5.3.0, use the DatePeriod class. It's unfortunately barely documented.

$start = new DateTime('6/30/2010');
$end = new DateTime('7/6/2010');
$oneday = new DateInterval("P1D");

$days = array();
$data = "7.5";

/* Iterate from $start up to $end+1 day, one day in each iteration.
   We add one day to the $end date, because the DatePeriod only iterates up to,
   not including, the end date. */
foreach(new DatePeriod($start, $oneday, $end->add($oneday)) as $day) {
    $day_num = $day->format("N"); /* 'N' number days 1 (mon) to 7 (sun) */
    if($day_num < 6) { /* weekday */
        $days[$day->format("Y-m-d")] = $data;
    } 
}    
print_r($days);

I found this and converted it in to minutes,

$start = new DateTime('2014-03-03 09:21:30');
$end = new DateTime('2014-03-11 17:23:15');
// otherwise the  end date is excluded (bug?)
$end->modify('+1 day');

$interval = $end->diff($start);

// total days
$days = $interval->days;
$days_inMin = ($interval->d*24*60) + ($interval->h*60) + $interval->i;

// create an iterateable period of date (P1D equates to 1 day)
$period = new DatePeriod($start, new DateInterval('P1D'), $end);

// best stored as array, so you can add more than one
$holidays = array('2014-03-07');

foreach($period as $dt) {
    $curr = $dt->format('D');

    // for the updated question
    if (in_array($dt->format('Y-m-d'), $holidays)) {
       $days--;
       $days_inMin -= (24*60);
    }

    // substract if Saturday or Sunday
    if ($curr == 'Sat' || $curr == 'Sun') {
        $days--;
        $days_inMin -= (24*60);
    }
}

echo 'Days: ' . $days; 
echo '<br>Days in Minutes: ' . $days_inMin . ' min = ' . $days_inMin/(24*60) . ' days';

Edit:

$office_hrs_min = $days_inMin - ($days * (14.5*60));
// as out of 24 only 8.5 hrs are working
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top