diff --git a/application/api/model/Room.php b/application/api/model/Room.php index 2206cc02..c13563e7 100644 --- a/application/api/model/Room.php +++ b/application/api/model/Room.php @@ -760,30 +760,104 @@ class Room extends Model } - // 方法2:转换为时间戳进行比较(更精确) public function isBetweenTime($start, $end, $current = null) { if ($current === null) { $current = date('H:i:s'); } - // 将时间转换为今天的秒数 - list($h1, $m1, $s1) = explode(':', $start); - list($h2, $m2, $s2) = explode(':', $end); - list($hc, $mc, $sc) = explode(':', $current); + // 处理特殊情况 + if (empty($start) || empty($end)) { + return false; // 营业时间未设置,返回不在营业 + } - $startSec = $h1 * 3600 + $m1 * 60 + $s1; - $endSec = $h2 * 3600 + $m2 * 60 + $s2; - $currentSec = $hc * 3600 + $mc * 60 + $sc; + // 24小时营业的判断(多种格式) + $is24Hours = + ($start === '00:00:00' && $end === '00:00:00') || + ($start === '00:00' && $end === '00:00') || + ($start === '0:00' && $end === '0:00') || + ($start === '00:00:00' && $end === '23:59:59') || + ($start === $end); // 开始结束时间相同也表示24小时 - if ($startSec <= $endSec) { - // 同一天内 + if ($is24Hours) { + return true; // 24小时营业 + } + + // 标准化时间格式(确保是HH:MM:SS格式) + $start = $this->normalizeTime($start); + $end = $this->normalizeTime($end); + $current = $this->normalizeTime($current); + + // 将时间转换为秒数 + $startSec = $this->timeToSeconds($start); + $endSec = $this->timeToSeconds($end); + $currentSec = $this->timeToSeconds($current); + + if ($startSec < $endSec) { + // 同一天内营业 return $currentSec >= $startSec && $currentSec <= $endSec; } else { - // 跨天 + // 跨天营业 return $currentSec >= $startSec || $currentSec <= $endSec; } } + /** + * 将时间字符串转换为秒数 + */ + private function timeToSeconds($time) { + $parts = explode(':', $time); + + // 确保有3部分 + if (count($parts) === 2) { + $parts[] = '00'; // 添加秒数 + } + + list($h, $m, $s) = $parts; + + // 处理格式错误 + $h = intval($h); + $m = intval($m); + $s = intval($s); + + return $h * 3600 + $m * 60 + $s; + } + + /** + * 标准化时间格式为 HH:MM:SS + */ + private function normalizeTime($time) { + // 移除可能的空格 + $time = trim($time); + + // 如果已经是 HH:MM:SS 格式,直接返回 + if (preg_match('/^\d{1,2}:\d{1,2}:\d{1,2}$/', $time)) { + $parts = explode(':', $time); + $parts = array_map('intval', $parts); + + // 确保各部分在合理范围内 + $parts[0] = max(0, min(23, $parts[0])); + $parts[1] = max(0, min(59, $parts[1])); + $parts[2] = max(0, min(59, $parts[2])); + + return sprintf('%02d:%02d:%02d', $parts[0], $parts[1], $parts[2]); + } + + // 如果是 HH:MM 格式,补充秒数 + if (preg_match('/^\d{1,2}:\d{1,2}$/', $time)) { + $parts = explode(':', $time); + $parts = array_map('intval', $parts); + + $parts[0] = max(0, min(23, $parts[0])); + $parts[1] = max(0, min(59, $parts[1])); + + return sprintf('%02d:%02d:00', $parts[0], $parts[1]); + } + + // 无法识别的格式,返回默认值 + return '00:00:00'; + } + + //进入房间前的判断 public function before_join_room_check($user_id, $room_id) { $room = db::name('vs_room')->where(['id' => $room_id,'apply_status' => ['in',[1,2]]])->find();