如何计算距离商家下次营业的剩余小时数?
解决商家下次营业时刻时间间隔计算问题
核心思路
当当日所有营业时间都已过期时,需要依次检查后续每一天的营业时间,找到第一个在当前时间之后的营业开始时刻,计算两者的时间差。
修改后的完整代码
$storeSchedule = [ 'Mon' => ['09:00 AM' => '12:00 AM'], 'Tue' => ['09:00 AM' => '12:00 AM'], 'Wed' => ['09:00 AM' => '12:00 AM'], 'Thu' => ['09:00 AM' => '12:00 AM'], 'Fri' => ['09:00 AM' => '12:00 AM'], 'Sat' => ['12:00 AM' => '01:00 AM', '09:00 AM' => '12:00 AM'], 'Sun' => [] // 可根据实际情况补充周日营业时间 ]; // 当前时间 $currentTime = new DateTime(); $status = -1; $daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; $currentDayIndex = array_search(date('D', $currentTime->getTimestamp()), $daysOfWeek); // 遍历当前及后续的日期(最多循环一周,避免无限循环) for ($i = 0; $i < 7; $i++) { $targetDayIndex = ($currentDayIndex + $i) % 7; $targetDay = $daysOfWeek[$targetDayIndex]; // 如果当天无营业时间,跳过 if (empty($storeSchedule[$targetDay])) continue; // 计算目标日期的基准时间(当天0点) $targetDate = (clone $currentTime)->modify("+$i day")->setTime(0, 0, 0); foreach ($storeSchedule[$targetDay] as $startStr => $endStr) { $startTime = DateTime::createFromFormat('h:i A', $startStr); $endTime = DateTime::createFromFormat('h:i A', $endStr); // 将时间绑定到目标日期 $start = (clone $targetDate)->setTime($startTime->format('H'), $startTime->format('i')); $end = (clone $targetDate)->setTime($endTime->format('H'), $endTime->format('i')); // 处理跨天的结束时间(比如12:00 AM实际是次日凌晨) if ($end < $start) { $end->modify('+1 day'); } // 当前时间在营业时段内 if ($currentTime >= $start && $currentTime <= $end) { $status = 0; break 2; // 跳出所有循环 } // 当前时间早于该时段开始时间,计算间隔 if ($currentTime < $start) { $diff = $currentTime->diff($start); $status = round($diff->h + $diff->i/60 + $diff->d*24, 2); break 2; } } } echo $status;
关键修改点说明
- 循环遍历后续日期:通过
$daysOfWeek数组循环当前及之后的一周日期,确保找到下一个营业日 - 绑定日期到时间对象:将营业时间字符串转换为带具体日期的
DateTime对象,避免仅比较时间部分的误差 - 处理跨天营业时间:当结束时间早于开始时间时(如
12:00 AM),自动将结束时间加一天,修正时间范围 - 精确计算时间差:使用
DateTime::diff()方法计算时间间隔,将天数、小时、分钟统一转换为小时数,保留两位小数
内容的提问来源于stack exchange,提问作者DDulla
相关产品推荐
相关产品推荐

