【发布时间】:2020-07-19 02:25:30
【问题描述】:
我正在尝试构建一个函数,该函数根据工作时间计算票证 SLA,并跳过非工作时间和周末的计算,并将时间相应地转移到第二天或下一个工作日。我对工单的响应 SLA 是 30 分钟,如果工单插入日期在工作日 {Mon-Fri} 和营业时间 {08:00:00 - 17:00:00} 内,那么我的结束日期应根据以下计算因素:
- 对于周一到周四,如果 insertDate 在工作时间之内,时间应该转移到工作时间的下一个 30 分钟,例如如果 案例1:插入日期='2020-07-16 16:00:00';在这里,我得到了预期的结果,endDate ='2020-07-16 16:30:00'; 如果 insertDate 时间戳超过工作时间窗口,例如如果 案例2:插入日期='2020-07-16 16:50:00';在这里,我没有得到预期的结果,应该是 endDate ='2020-07-17 08:20:00';
- 对于周末(周六到周日),在这个周末窗口创建的任何票,计算应该从周一开始,从 08:00:00 开始 案例3:插入日期='2020-07-18 16:50:00';在这里,我没有得到预期的结果,应该是 endDate ='2020-07-20 08:30:00';
下面是我的代码,它适用于 case1 很好,ubt 中断了 case2 和 case3,对此的任何帮助都非常感谢。
<?php
function calculateSLA($totalMinutes){
$insertDate = '2020-07-16 16:00:00';
$endDate = date('Y-m-d H:00:00',strtotime($insertDate));
//$t_min = date('i',strtotime($insertDate));
$BusinessStart = '08:00:00';
$BusinessEnd = '17:00:00';
$i = 1;
$flag = false;
while ($totalMinutes > 0) {
$day = date('D', strtotime($endDate)); // fetching day of week
if ($day == 'Sat') { // checking if saturday thenskip by adding 2 day to end date
$endDate = date('Y-m-d', strtotime($endDate . " +2 Day")) . ' ' . $BusinessStart; // adding 2 day if saturday
continue;
}
$diff = strtotime($BusinessEnd) - strtotime(date("H:i:s", strtotime($insertDate))); // getting difference of time of office end date and result end date
var_dump($diff);
$mins = $diff / (60); // difference in mins.
if ($mins > $totalMinutes) {
$mins = $totalMinutes;
$flag = true;
} else {
$mins = $totalMinutes - $mins; // substracting mins from total minutes left
}
$endDate = date('Y-m-d H:i:s', strtotime("+$mins Minute", strtotime($insertDate))); // adding subtracted minutes
if (!$flag) {
$endDate = date('Y-m-d', strtotime($insertDate . " +1 Day")) . ' ' . $BusinessStart; // if not last loop add day to result end date
} else {
break;
}
}
echo $endDate;
}
calculateSLA(30);
?>
【问题讨论】:
标签: php