PHP计算两个日期时间工作时长问题:无法计算分钟与秒
我看了你的问题,你的sla_response函数没法计算分钟和秒数,核心问题出在你用了PT1H的DateInterval——这会让你只按整小时遍历时间区间,自然会丢失分钟和秒的精度。另外你的代码没贴全,不过我猜你是想计算**工作时间内(比如7点开始的时段)**的SLA响应时长对吧?
我给你调整一下代码,直接计算两个时间的总差值,再拆分到工作时段里,同时保留分钟和秒的精度:
public static function sla_response($dataopen, $dataarrival, $addslar) { $startDate = new DateTime($dataopen); $endDate = new DateTime($dataarrival); // 如果结束时间早于开始时间,直接返回0 if ($endDate <= $startDate) { return '00:00:00'; } $totalSeconds = 0; $currentDate = clone $startDate; while ($currentDate < $endDate) { // 当天工作开始和结束时间(这里假设工作结束时间是18:00,你可以根据需求调整) $workStart = clone $currentDate; $workStart->setTime(7, 0, 0); $workEnd = clone $currentDate; $workEnd->setTime(18, 0, 0); // 确定当天的实际开始和结束点 $intervalStart = max($currentDate, $workStart); $intervalEnd = min($endDate, $workEnd); // 如果当天有工作时段的重叠,计算秒数 if ($intervalStart < $intervalEnd) { $diff = $intervalStart->diff($intervalEnd); $totalSeconds += $diff->s + $diff->i*60 + $diff->h*3600; } // 跳到下一天的工作开始时间 $currentDate->modify('+1 day'); $currentDate->setTime(7, 0, 0); } // 加上额外的SLA时长($addslar默认按秒数处理,格式不同可调整) $totalSeconds += $addslar; // 转换为H:i:s格式 $hours = floor($totalSeconds / 3600); $minutes = floor(($totalSeconds % 3600) / 60); $seconds = $totalSeconds % 60; return sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds); }
关键调整点:
- 不再用整小时遍历,而是按天处理工作时段,计算每个重叠区间的精确秒数
- 直接用
diff()获取两个时间的差值,保留秒级精度 - 最后把总秒数格式化为带分钟和秒的时间字符串
另外,注意几个细节:
- 我假设工作结束时间是18:00,你可以根据实际需求修改
$workEnd->setTime(18, 0, 0)的时间 - 如果
$addslar是类似PT30M这样的DateInterval格式,可改成下面的方式处理:$addInterval = new DateInterval($addslar); $totalSeconds += $addInterval->s + $addInterval->i*60 + $addInterval->h*3600 + $addInterval->d*86400; - 函数返回的是格式化后的时间字符串,你也可以改成返回总秒数,根据需求调整
这样就能精确计算到分钟和秒啦!
内容的提问来源于stack exchange,提问作者Zakario Lesrahmanto
相关产品推荐
相关产品推荐

