【问题标题】:Retrieve remaining time between two dates considering business hours考虑营业时间,检索两个日期之间的剩余时间
【发布时间】:2020-05-17 02:04:55
【问题描述】:

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

谢谢提前。

【问题讨论】:

  • 那么你还在纠结什么?
  • 你能贴一些代码吗?
  • 用代码示例编辑

标签: php datetime


【解决方案1】:

您可以使用以下功能

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

【讨论】:

    【解决方案2】:

    我想我会将问题分解为多个部分。计算完间隔的总天数后,先处理掉一周内发生的小事。

    首先计算“整周”的数量。每个“整周”为五个工作日。减去相应的时间间隔并继续。现在,查看开始日期的星期几:每一天都会增加一定的天数。然后是结束日期的星期几,同样。然后,您可以根据需要考虑一天中的时间。

    假期是一个简单的表格:如果日期在范围内,则减去一天。

    现在...说了这么多,我要做的第一件事就是搜索 GitHub 和 SourceForge!因为我非常确定有人已经这样做了。 :-D

     "Actum Ne Agas:  Do Not Do A Thing Already Done."
    

    【讨论】:

    • 在 GitHub 上找到了一些库,但没有一个库可以做我需要的计算,你能给我一个适合我情况的库吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 2023-03-26
    • 2019-08-04
    相关资源
    最近更新 更多