房间营业时间
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user