【问题标题】:Calculate the end date(SLA) from its start date in business hours从营业时间的开始日期计算结束日期(SLA)
【发布时间】:2019-03-29 10:10:25
【问题描述】:

我需要计算给定开始日期的结束日期/SLA,考虑到工作时间/工作日内的完成时间(以分钟为单位)。

例如:

  • 开始日期 = 2019-03-29 15:00:00
  • 完成时间 = 720(分钟)

考虑到每天 8 小时的工作时间(上午 9 点到下午 5 点)和周日的周末。结束日期应为 2019-04-01 11:00:00。

所以总小时数是 12,

  • 2019-03-29 15:00:00 至 17:00:00(2 小时)
  • 2019-03-30 09:00:00 至 17:00:00(8 小时)
  • 2019 年 4 月 1 日 09:00:00 至 11:00:00(2 小时)

任何有关这方面的帮助将不胜感激。

到目前为止,我可以获得不包括周末的总工作日,但获得准确的结束时间是我苦苦挣扎的地方。

谢谢。

更新:

$bookingDateTime = Carbon::parse('2019-03-29 15:00:00');
$i = 0;
$completion_in_days = (720/60)/8; //converted minutes in no of days
$working_days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];

while($i < ($completion_in_days)){
   if(array_search(strtolower($bookingDateTime->englishDayOfWeek), $working_days) !== false){
       $i++; 
   }

   $bookingDateTime->addDay();
}

这会给我结束日期。

【问题讨论】:

  • 这句话错了on 2019-04-01 from 09:00:00 to 10:00:00 (2 hours) 应该是11:00:00
  • @RahulMeshram 谢谢哥们,在你的帮助下,我找到了解决方案。
  • 太棒了!如果您觉得我的回答可以帮助您解决问题,您可以接受我的回答。快乐编码!

标签: php laravel date


【解决方案1】:

请在下面找到sn-p,我逐行注释理解

$endDate     = $startDate     = '2019-03-29 15:00:00';
$officeStart = '09:00:00';
$officeEnd   = '17:00:00';
$totalHours  = 12;
$i           = 1;
$flag        = false;
while ($totalHours > 0) {
    $day = date('D', strtotime($endDate)); // fetching day of week
    if ($day == 'Sun') { // checking if sunday thenskip by adding 1 day to end date
        $endDate = date('Y-m-d', strtotime($endDate . " +1 Day")) . ' ' . $officeStart; // adding one day if sunday
        continue;
    }
    $diff  = strtotime($officeEnd) - strtotime(date("H:i:s", strtotime($endDate))); // getting difference of time of office end date and result end date
    $hours = $diff / (3600); // difference in minutes
    if ($hours > $totalHours) {
        $hours = $totalHours;
        $flag  = true; // to break loop if last loop comes
    } else {
        $totalHours = $totalHours - $hours; // substracting hours from total hours left
    }
    $endDate = date('Y-m-d H:i:s', strtotime("+$hours Hour", strtotime($endDate))); // adding hours which are substracted
    if (!$flag) {
        $endDate = date('Y-m-d', strtotime($endDate . " +1 Day")) . ' ' . $officeStart; // if not last loop add day to result end date
    } else {
        break;
    }
}

输出

2019-04-01 11:00:00

Demo.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多