You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算距离商家下次营业的剩余小时数?

解决商家下次营业时刻时间间隔计算问题

核心思路

当当日所有营业时间都已过期时,需要依次检查后续每一天的营业时间,找到第一个在当前时间之后的营业开始时刻,计算两者的时间差。

修改后的完整代码

$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 18:36:25