0

ブリーフィング:

構築中のカスタム プロジェクト管理システムの 2 つの日付間の営業日を計算しようとしています。以下に示すように、これまでに作成したものを次に示します。正常に動作しているように見えますが、どれだけ正確か、使用する必要があるかどうかはわかりません。どんなフィードバックでも大歓迎です!

コード

<?php

    # date variables:
    date_default_timezone_set('Asia/Kuwait');
    $date['start'] = date('Y-m-d H:i:s');
    $date['end'] = '2013-12-01 08:00:00';
    $date['off'] = array('Friday','Saturday'); # usual days off in Kuwait)

    # calculate the difference:
    $date_s = new DateTime($date['start']);
    $date_e = new DateTime($date['end']);
    $interval = $date_s->diff($date_e);

    # obtain relevant values:
    $remaining_days = $interval->format('%r%a');
    $remaining_weeks = floor($remaining_days/7);
    $weekend_days = ($remaining_weeks*count($date['off']));

    # additional holidays (just an example):
    $extra_holidays_array = array
    (
        'holiday 1' => '2013-06-24 00:00:00',
        'holiday 2' => '2013-06-25 00:00:00',
        'holiday 3' => '2013-07-01 00:00:00',
        'holiday 4' => '2013-08-24 00:00:00'
    );

    # check if a real holiday:
    $extra_holidays = 0;
    foreach( $extra_holidays_array as $check_date )
    {
        $day_of_holiday = date('l', strtotime($check_date));
        if( ! in_array($day_of_holiday,$date['off']) ){ $extra_holidays++; }
    }

    # total holidays:
    $total_holidays = ($weekend_days+$extra_holidays);

    # business days:
    $business_days_nh = ($remaining_days-$weekend_days); # NO extra holidays
    $business_days_wh = ($remaining_days-$weekend_days-$extra_holidays); # WITH extra holidays

?>

<ul>
<li>Current Date: <?php echo $date['start']; ?></li>
<li>Deadline Date: <?php echo $date['end']; ?></li>
</ul>
<ul>
<li>Remaining Days: <?php echo $remaining_days; ?></li>
<li>Remaining Weeks: <?php echo $remaining_weeks; ?></li>
</ul>
<ul>
<li>Usual Holidays: <?php echo $weekend_days; ?></li>
<li>Extra Holidays: <?php echo $extra_holidays; ?></li>
<li>Total Holidays: <?php echo $total_holidays; ?></li>
</ul>
<ul>
<li>Business Days (Before Holidays): <?php echo $business_days_nh; ?></li>
<li>Business Days (After Holidays): <?php echo $business_days_wh; ?></li>
</ul>
4

1 に答える 1

1

この正確な目的のために、以前のプロジェクトで関数を作成しました。

パラメータとして使用するものは次のとおりです。

  • $start - Unix タイムスタンプを開始します (strtotime('1st january 2013') を使用してタイムスタンプを取得できます)
  • $end - UNIX タイムスタンプの終了
  • オプションの $holidays - 休日 (IE の銀行休業日など) としてカウントする日付の配列。日付のstrtotime()変換に使用します。
  • オプションの $returnAsArray - 営業日のタイムスタンプのリスト、または単に営業日数を返します

重要 : 与えられるタイムスタンプは、次のように 1 日の始まりのタイムスタンプである必要があります。

2013 年 1 月 1 日をタイムスタンプとして使用するには、次の値を使用します。mktime(0, 0, 0, 1, 1, 2013);

function networkDays($start, $end, array $holidays = array(), $returnAsArray = false)
{
    if(!is_int($start)){ 
        trigger_error('Parameter 1 expected to be integer timestamp. ' . ucfirst(gettype($start)) . ' given.', E_USER_WARNING);
        return false;
    }

    if(!is_int($end)){ 
        trigger_error('Parameter 2 expected to be integer timestamp. ' . ucfirst(gettype($start)) . ' given.', E_USER_WARNING);
        return false;
    }

    if(!is_array($holidays)){ 
        $holidays = array();
        trigger_error('Parameter 3 expected to be Array. ' . ucfirst(gettype($holidays)) . ' given.', E_USER_NOTICE);
    }

    if(!is_bool($returnAsArray)){ 
        trigger_error('Parameter 4 expected to be Boolean. ' . ucfirt(gettype($returnAsArray)) . ' given.', E_USER_WARNING);
        return false;
    }


    if($start>=$end){ 
        $nEnd = $start;
        $nStart = $end;

        $start = $nStart;
        $end = $nEnd;
    }


    foreach($holidays as $key => $holiday)
    {
        $holidays[$key] = strtotime($holiday);
    }


    $numberOfDays = ceil(((($end-$start)/60)/60)/24);

    $networkDay = 0;
    $networkDayArray = array();

    for($d = 0; $d < $numberOfDays; $d++)
    {
        $dayTimestamp = $start+(86400*$d);

        if(date('N',$dayTimestamp)<6 && !in_array($dayTimestamp,$holidays))
        {
            $networkDay += 1;
            $networkDayArray[] = $dayTimestamp;
        }
    }


    if($returnAsArray)
    {
        return $networkDayArray;
    } else {
        return $networkDay;
    }
}
于 2013-05-27T16:56:44.113 に答える