PHP

PHP排除休假非工作时间教程

silverwq
2022-06-30 / 0 评论 / 259 阅读 / 正在检测是否收录...

一、概述

我们经常在工作中遇到计算工作时间,需要排除节假日,排除下班时间,排除午休时间。

二、实现

需求如下:

  1. 排除节假日,因为节假日不固定,这自己建立表来维护节假日。

  2. 正常工作时间为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;
    }
0

评论 (0)

取消