php - 考虑营业时间,检索两个日期之间的剩余时间
问题描述
我正在尝试编写一个 php 解决方案来计算计划的结束时间,考虑到营业时间的目标。
它不应该考虑某些日子(从保存在数据库中的设置中检索),例如假期。
还从 db (morning_from (8:30am), morning_to (1:00pm), night_from (2:30pm), night_to (6:30pm)) 检索营业时间。
我想开发这个脚本,因为我希望我的页面每天显示打开的票证的技术解决剩余时间。
例如:
与 10 个工作小时签订合同的客户 SLA 在今天(星期五)31/01/2020 16:00:00 开票,考虑到在 noBusinessDays = array("saturday", "sunday")和前面提到的businessHours设置(8 :30-13:00/14:30-18:30),结果必须是 2020 年 3 月 2 日星期一 17:30:00。
代码示例:
$noBusinessDays = array("saturday", "sunday");
$businessHours = array("morning_from" => "8:30", "morning_to" => "13:00", "evening_from" => "14:30", "evening_to" => "18:30");
$SLA = "10"; //hours
$ticketDate = new DateTime();
$ticketDate->setTimestamp(strtotime("31/01/2020 16:00:00"));
// I don't know how to use my arrays to say in this calculation how to use them
$maximumLimit = $ticketDate->add(new DateInterval("PT" . $SLA ."H"));
提前谢谢你。
解决方案
您可以使用以下功能
// intersection of 2 time intervals
// input - Unix timestamps (start,end)
// output - intersection in seconds
function time_union($b_1,$e_1,$b_2,$e_2)
{
return max(0,$e_1-$b_1 - max(0,$e_1-$e_2) - max(0,$b_2-$b_1));
}
您将从一个空的时间间隔开始,[X, Y)
其中X
是工单创建的时间戳,Y
最初等于X
。
然后你开始Y
逐一添加天数。每次您扩展时间间隔以包含另一天时 - 您使用上述功能检查有多少 SLA 小时与您刚刚添加的当天的工作时间覆盖(即重叠)。如果这一天被标记为假期 - 您只需跳过它并继续下一个日期。
如果您发现 SLA 时间部分包含在早上或晚上的工作时间中 - 您应该简单地减去额外的时间。
最后Y
将等于您要在应用程序中显示的时间戳。
推荐阅读
- sql - Bigquery 查询以获取在斜线后与特定模式匹配的所有出现
- python - 从 MulinomialNB 中提取对数概率
- json-rpc - 比特币发送到地址——那些该死的费用解释了吗?
- reactjs - React Jest - 即使在添加了 mockFiles 和 identity-obj-proxy 之后,测试套件也无法为 PNG 文件运行
- c# - 使用条件从 DataTable 中删除重复行 - C#
- typescript - 如何在 typescript eslint 中强制执行文件名和文件夹名称约定?
- javascript - 来自后端的实时计算页面
- node.js - 当我运行 create-creat-app
低于错误 - android - 当用户单击列表项/将当前列表项转换为按钮时,需要将用户带到不同的页面吗?
- reactjs - Class.contextType 和 Context.Consumer 之间的区别与工作示例