時間計算あれこれ

勤怠関係の設定

# 時間計算

$time_value = time_exec($start_time,
$end_time,$open_time,$close_time,$rest_start,
$rest_end);
echo("<br>業務時間:$time_value");

list($time_value1,$time_value2) = 
late_early($start_time,$end_time,$open_time,
$close_time,$rest_start,$rest_end);
echo("<br>遅刻時間:$time_value1");
echo("<br>早退時間:$time_value2");

$time_value = time_exec($start_time,
$end_time,$over1_start,$over1_end);
echo("<br>通常残業時間:$time_value");

$time_value = time_exec($start_time,
$end_time,$over2_start,$over2_end);
echo("<br>深夜残業時間:$time_value"); 

・時間を計算する関数

# 遅刻&早退時間計算関数

function late_early($start,$end,$open,$close,$rest_start,$rest_end){
    # 遅刻時間の計算
    if($open < $start and $start < $close){
        if($rest_start < $start and $start <= $rest_end) 
$start = $rest_start;
        elseif($rest_end < $start) $start = rest_time($start);
        $time_value1 = time_value($open,0,$start,1);
    }
    # 早退時間の計算
    if($open < $end and $end < $close){
        if($rest_start <= $end and $end < $rest_end) $end = $rest_end;
        elseif($end < $rest_start) $end = rest_time($end);
        $time_value2 = time_value($end,0,$close);
    }
    return array($time_value1,$time_value2);
}

# 時間計算関数

function time_exec($start,$end,$open,$close,$rest_start=NULL,$rest_end=NULL){
    
    if($start <= $open) $start = $open;
    if($end >= $close) $end = $close;
    
    # 休憩時間が入ってる場合
    if($rest_start != NULL){
        if($start < $rest_start and $rest_end < $end) $end = rest_time($end);
        elseif($start < $rest_start and $rest_start <= $end and $end <= $rest_end) $end = $rest_start;
        elseif($rest_start <= $start and $start <= $rest_end and $rest_end < $end) $start = $rest_end;
        elseif($rest_start <= $start and $end <= $rest_end){
            $start = $close;
            $end = $close;
        }
    }
    
    # 開始時間が終了時間より早いときのみ計算
    if($start < $end) $time_value = time_value($start,1,$end);
    return $time_value;
}

# 休憩時間処理

function rest_time($time_value){
    $time_value = date("Y-m-d H:i:s", strtotime($time_value) - 60*60);
    return $time_value;
}

# 時間計算

function time_value($start,$plus1,$end,$plus2=0){
    $start = quarter_round($start,$plus1);
    $end = quarter_round($end,$plus2);
    $time_value = date("H:i:s", strtotime($end) - strtotime($start) - 60*60*9);
    return $time_value;
}

# 15分単位にする関数

function quarter_round($round_time,$plus=0){
    # 分だけ取り出す
    $time_array = explode(":",$round_time);
    $round_time = $time_array[1];
    $quarter_array = array(0,15,30,45,60);
    $switch = false;
    $next_value = 0;
    foreach($quarter_array as $value){
        $prev_value = $next_value;
        $next_value = $value;
        if($prev_value < $round_time and $round_time < $next_value){
            $round_time = $prev_value;
            $switch = true;
        }
    }
    
    # 開始時間は15分単位で切り捨ててまた15分を足す
    if($plus and $switch) $round_time += 15;
    
    # 元の形に戻す
    $round_time = $time_array[0].":".$round_time.":00";
    return $round_time;
}
?>