计算有效工作时间,不限制工作日和上下班具体时间,只需传入上下班打卡时间及中间休息的时间段,即可得出有效工作时间,单位为分钟
/**
* 计算有效工作时间
* @param $punch_uptime 上班打卡时间
* @param $punch_downtime 下班打卡时间
* @param $not_work_time 休息时间的时间段
* 例:[
'1'=>['00:00','01:30','90'], //休息开始时间 休息结束时间 休息时长(分)
'2'=>['05:30','06:00','30'],
'3'=>['12:00','13:30','90'],
'4'=>['17:30','18:00','30'],
];
* @return false|float|int|mixed
* /
public static function get_effective_work_time($punch_uptime,$punch_downtime,$not_work_time){
if ($punch_uptime > $punch_downtime){
return 0;
}
$ymd_u = date('Y-m-d',$punch_uptime);
$time_u = date('H:i',$punch_uptime);
$ymd_d = date('Y-m-d',$punch_downtime);
$time_d = date('H:i',$punch_downtime);
$rest_time = 0; //休息时长
$is_reverse = 0; //是否反向计算
if ($ymd_u != $ymd_d){
$days = ($punch_downtime-$punch_uptime)/60/60/24;
if ($days >= 2){
$not_work_time_arr = array_column($not_work_time,2);
$rest_time += array_sum($not_work_time_arr)*floor($days-1);
}
$is_reverse = 1;
}
$start_k = 0;
$end_k = 0;
$not_work_time_key = [];
foreach ($not_work_time as $key=> $item){
if ($is_reverse == 1){
if ($time_u >= $item[0]){
$start_k = $key;
}
if ($time_d <= $item[1] && $end_k==0){
$end_k = $key;
}
if ($time_u >= $item[0] && $time_u <= $item[1]){
$punch_uptime = strtotime($ymd_u.$item[1]);
}
if ($time_d >= $item[0] && $time_d <= $item[1]){
$punch_downtime = strtotime($ymd_d.$item[0]);
}
}else{
if ($time_u <= $item[0] && $start_k==0){
$start_k = $key;
}
if ($time_d >= $item[1]){
$end_k = $key;
}
if ($time_u >= $item[0] && $time_u <= $item[1]){
$punch_uptime = strtotime($ymd_u.$item[1]);
}
if ($time_d >= $item[0] && $time_d <= $item[1]){
$punch_downtime = strtotime($ymd_d.$item[0]);
}
}
$not_work_time_key[] = $key;
}
//计算出打卡内的工作时间
$work_time = ceil(($punch_downtime - $punch_uptime)/60);
//获取休息时间(分)
if ($is_reverse == 1){
$not_work_time_key_1 = $not_work_time_key;
foreach ($not_work_time_key_1 as $k => $i){
if ($i <= $start_k){
unset($not_work_time_key_1[$k]);
}
}
$not_work_time_key_2 = $not_work_time_key;
foreach ($not_work_time_key_2 as $k => $i){
if ($end_k >0 && $i >= $end_k){
unset($not_work_time_key_2[$k]);
}
}
$not_work_time_key = array_merge($not_work_time_key_1,$not_work_time_key_2);
}else{
foreach ($not_work_time_key as $k => $i){
if ($i < $start_k){
unset($not_work_time_key[$k]);
}
if ($i > $end_k){
unset($not_work_time_key[$k]);
}
}
if (count($not_work_time_key) == 4){
$not_work_time_key = [];
}
}
if (count($not_work_time_key) > 0){
foreach ($not_work_time as $key=> $value){
foreach ($not_work_time_key as $v){
if ($key == $v){
$rest_time += $value[2];
}
}
}
}else{
if ($is_reverse == 1){
foreach ($not_work_time as $key=> $value) {
$rest_time += $value[2];
}
}
}
//有效工作时间 = 打卡时间 - 休息时间
if ($work_time <= 0){
$work_time = 0;
}else{
$work_time = $work_time - $rest_time;
}
return $work_time;
}