首页 > 解决方案 > 考虑营业时间,检索两个日期之间的剩余时间

问题描述

我正在尝试编写一个 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"));

提前谢谢你。

标签: phpdatetime

解决方案


您可以使用以下功能

// 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将等于您要在应用程序中显示的时间戳。


推荐阅读