房间营业时间

This commit is contained in:
2026-01-20 11:20:57 +08:00
parent d52db5ea5f
commit af921cc166

View File

@@ -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();