计算在工作日时间推迟时间的算法

简介: 计算在工作日时间推迟时间的算法
<?php
namespace App\\Http\\Services;
/**
 * 工作日时间类
 */
class WorkTimeService
{
    protected $workTimeRange = \[
        "9:00:00"  => "12:30:00",
        "13:30:00" => "18:00:00"
    \];
    protected $holidayDay = \[
        "2022-01-01" => "2022-01-03",
        "2022-01-31" => "2022-02-06",
        "2022-04-03" => "2022-04-05",
        "2022-04-30" => "2022-05-04",
        "2022-09-10" => "2022-09-12",
        "2022-10-01" => "2022-10-07",
    \];
    protected $holidayExtraWorkDay = \[
        "2022-01-29" => "2022-01-30",
        "2022-04-02" => "2022-04-02",
        "2022-04-24" => "2022-04-24",
        "2022-05-07" => "2022-05-07",
        "2022-10-08" => "2022-10-09",
    \];
    protected $workDayData = \[
        "11111111111111" => "222222222222"//时间戳
    \];
    protected $holidayData = \[
        "11111111111111" => "222222222222"//时间戳
    \];
    public function __construct($workTimeRange = \[\], $holidayDay = \[\], $holidayExtraWorkDay = \[\])
    {
        ini_set('date.timezone', 'Asia/Shanghai');
        if (!empty($workTimeRange)) {
            $this->workTimeRange = $workTimeRange;
        }
        if (!empty($holidayDay)) {
            $this->holidayDay = $holidayDay;
        }
        if (!empty($holidayExtraWorkDay)) {
            $this->holidayExtraWorkDay = $holidayExtraWorkDay;
        }
        $this->initDay();
    }
    public function initDay()
    {
        foreach ($this->holidayDay as $startDate => $endDate) {
            $this->holidayData\[strtotime($startDate)\] = strtotime($endDate);
        }
        ksort($this->holidayData);
        foreach ($this->holidayExtraWorkDay as $startDate => $endDate) {
            $this->workDayData \[strtotime($startDate)\] = strtotime($endDate);
        }
        ksort($this->workDayData);
    }
    public function getDelayWorkTime($datetime, $delayTime = 0)
    {
        //判断当日是否为上班日
        $isWorkDay = $this->checkIsWorkDay($datetime);
        $time = strtotime($datetime);
        if ($isWorkDay) {
            //如果是,则计算上班时间
            $workTimeDate = $this->initWorkTime(date("Y-m-d", strtotime($datetime)));
            foreach ($workTimeDate as $startTime => $endTime) {
                //比如当天12点半下班,1点半上班,你现在时间为12点半,则可以继续推进到1点半的时间段
                if ($time < $startTime) {
                    $time = $startTime;
                }
                if ($time >= $startTime && $time <= $endTime) {//如果当前工作时间在这个时间段内
                    $decTime = $endTime - $time;//算出离下班还有多少时间
                    if ($decTime > $delayTime) {//如果延时时间小于下班时间,则说明完成循环
                        $decTime = $delayTime;
                    }
                    $time = $time + $decTime;//时间往前推进
                    $delayTime = $delayTime - $decTime;//延时时间减少
                }
                if ($delayTime<=0){
                    break;
                }
            }
            if ($delayTime <= 0) {
                return date("Y-m-d H:i:s", $time);
            } else {
                $datetime = date("Y-m-d", strtotime($datetime) + 86400);
                return $this->getDelayWorkTime($datetime, $delayTime);
            }
        } else {
            //如果不是上班日,则直接推进时间
            $datetime = date("Y-m-d", strtotime($datetime) + 86400);
            return $this->getDelayWorkTime($datetime, $delayTime);
        }
    }
    public function checkIsWorkDay($date)
    {
        $week = date("w", strtotime($date));
        if (in_array($week, \[1, 2, 3, 4, 5\])) {//周一到周五
            //验证是否为节假日,如果是则不用上班
            if ($this->checkHoliday($date)) {
                return false;
            }
            return true;
        } else {//周末
            if ($this->checkWorkDay($date)) {//验证是否要调休,如果是则需要上班
                return true;
            }
            return false;
        }
    }
    public function checkHoliday($date)
    {
        $time = strtotime($date);
        foreach ($this->holidayData as $startTime => $endTime) {
            if ($time >= $startTime && $time <= $endTime) {
                return true;
            }
        }
        return false;
    }
    public function checkWorkDay($date)
    {
        $time = strtotime($date);
        foreach ($this->workDayData as $startTime => $endTime) {
            if ($time >= $startTime && $time <= $endTime) {
                return true;
            }
        }
        return false;
    }
    public function initWorkTime($date)
    {
        $workTimeData = \[\];
        foreach ($this->workTimeRange as $startTime => $endTime) {
            $workTimeData\[strtotime($date . " " . $startTime)\] = strtotime($date . " " . $endTime);
        }
        ksort($workTimeData);
        return $workTimeData;
    }
}


image.png

目录
相关文章
|
8天前
|
算法 C++
如何精确计算出一个算法的CPU运行时间?
如何精确计算出一个算法的CPU运行时间?
|
1月前
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
2月前
|
算法 Go Python
[算法]计算斐波拉契数列
[算法]计算斐波拉契数列
|
2月前
|
算法
计算空间物体包围球的两种算法实现
计算空间物体包围球的两种算法实现
40 0
|
4月前
|
机器学习/深度学习 算法
**反向传播算法**在多层神经网络训练中至关重要,它包括**前向传播**、**计算损失**、**反向传播误差**和**权重更新**。
【6月更文挑战第28天】**反向传播算法**在多层神经网络训练中至关重要,它包括**前向传播**、**计算损失**、**反向传播误差**和**权重更新**。数据从输入层流经隐藏层到输出层,计算预测值。接着,比较预测与真实值计算损失。然后,从输出层开始,利用链式法则反向计算误差和梯度,更新权重以减小损失。此过程迭代进行,直到损失收敛或达到训练次数,优化模型性能。反向传播实现了自动微分,使模型能适应训练数据并泛化到新数据。
57 2
|
4月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
4月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
4月前
|
算法
m基于PSO粒子群优化的LDPC码NMS译码算法最优归一化参数计算和误码率matlab仿真
MATLAB2022a仿真实现了基于遗传优化的NMS LDPC译码算法,优化归一化参数以提升纠错性能。NMS算法通过迭代处理低密度校验码,而PSO算法用于寻找最佳归一化因子。程序包含粒子群优化的迭代过程,根据误码率评估性能并更新解码参数。最终,展示了迭代次数与优化过程的关系,并绘制了SNR与误码率曲线。
43 2
|
4月前
|
机器学习/深度学习 自然语言处理 算法
心得经验总结:机器翻译评测——BLEU算法详解(新增在线计算BLEU分值)
心得经验总结:机器翻译评测——BLEU算法详解(新增在线计算BLEU分值)
65 0
|
4月前
|
算法
m基于PSO粒子群优化的LDPC码OMS译码算法最优偏移参数计算和误码率matlab仿真
MATLAB2022a仿真实现了Offset Min-Sum (OMS)译码算法与粒子群优化(PSO)结合,以优化偏移参数,提升LDPC码解码性能。PSO通过迭代寻找最小化误码率(BER)的最佳偏移量。核心程序运用PSO进行参数更新和适应度函数(BER)评估,最终在不同信噪比下展示OMS解码性能,并保存结果。
53 0
下一篇
无影云桌面