時間計算あれこれ
勤怠関係の設定
# 時間計算
$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; } ?>