php计算有效工作时间不限制时间

计算有效工作时间,不限制工作日和上下班具体时间,只需传入上下班打卡时间及中间休息的时间段,即可得出有效工作时间,单位为分钟

 /**
 * 计算有效工作时间
 * @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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值