一、概述
我们经常在工作中遇到计算工作时间,需要排除节假日,排除下班时间,排除午休时间。
二、实现
需求如下:
-
排除节假日,因为节假日不固定,这自己建立表来维护节假日。
-
正常工作时间为08:30-12:00,13:00-17:30;
// $isTat为true的话表示只排除节假日 public static function calculateWorkTime($startTime,$endTime,$isTat = false) { if (!is_int($startTime)) { $startTime = strtotime($startTime); } if (!is_int($endTime)) { $endTime = strtotime($endTime); } // 获取节假日日期,可以根据自己实际情况获取 $holiday = ErpFacade::callTask( [Erp::C_SETTING,'FactoryHolidayTask@getHolidaysByTime'],[$startTime,$endTime] ); $totalTime = 0; // 上下班时间 $startWorkTime = $isTat ? 0 : 8.5 * 3600; $endWorkTime = $isTat ? 24 * 3600 : 17.5 * 3600; // 午休时间 $startNoonTime = $isTat ? 0 : 12 * 3600; $endNoonTime = $isTat ? 0 : 13 * 3600; $nooTimeRange = $endNoonTime - $startNoonTime; $startDate = date('Ymd',$startTime); $endDate = date('Ymd',$endTime); for ($i = $startDate; $i<=$endDate; $i = date('Ymd',strtotime("+1 day", strtotime($i)))) { $dateTotalTime = 0; $timeStamp = strtotime($i); $st = intval($timeStamp + $startWorkTime); $ed = intval($timeStamp + $endWorkTime); $nooSt = $timeStamp + $startNoonTime; $noonEd = $timeStamp + $endNoonTime; if (in_array($i,$holiday)) { continue; } if ($startDate == $endDate) { // 同一天的情况 if ($startTime <= $st ) { $stTime = $st; } elseif ($startTime <= $ed) { $stTime = $startTime; } else { $stTime = $ed; } if ($stTime > $nooSt && $stTime < $noonEd) { $stTime = $nooSt; } if ($endTime <= $st ) { $edTime = $st; } elseif ($endTime <= $ed) { $edTime = $endTime; } else { $edTime = $ed; } if ($endTime > $nooSt && $endTime < $noonEd) { $edTime = $noonEd; } $currentNooTimeRange = 0; if (date("H",$stTime) <= 12 && date("H",$edTime) >= 13) { $currentNooTimeRange = $nooTimeRange; } $dateTotalTime = $edTime - $stTime - $currentNooTimeRange; } else { if ($startDate == $i) { // 开始日期 if ($startTime <= $st) { $stTime = $st; } elseif ($startTime <= $ed) { $stTime = $startTime; } else { $stTime = $ed; } if ($stTime > $nooSt && $stTime < $noonEd) { $stTime = $nooSt; } $currentNooTimeRange = 0; if (date("H",$stTime) <= 12 && date("H",$ed) >= 13) { $currentNooTimeRange = $nooTimeRange; } $dateTotalTime = $ed - $stTime - $nooTimeRange; } elseif ($endDate == $i) { // 结束日期 if ($endTime <= $st ) { $edTime = $st; } elseif ($endTime <= $ed) { $edTime = $endTime; } else { $edTime = $ed; } if ($endTime > $nooSt && $endTime < $noonEd) { $edTime = $noonEd; } $currentNooTimeRange = 0; if (date("H",$st) <= 12 && date("H",$edTime) >= 13) { $currentNooTimeRange = $nooTimeRange; } $dateTotalTime = $edTime - $st - $nooTimeRange; } else { $dateTotalTime = $endWorkTime - $startWorkTime - $nooTimeRange; } } $totalTime += $dateTotalTime; } return $totalTime; }