如何用PHP判断用户指定的起止时间是否过期(附库结构与示例代码)
判断游戏时段是否活跃/过期的PHP实现方案
嘿,我来帮你搞定这个时段判断的问题!首先得处理数据库里那些12小时制的时间格式,尤其是跨天的情况(比如你例子里游戏ID100,从晚上10:45到凌晨12:30,这时候结束日期其实是第二天),直接字符串对比很容易出错,用PHP的DateTime类来处理是最稳妥的。
核心思路
- 把数据库里的分散日期、时间字段组合成完整的时间字符串,转成
DateTime对象 - 处理跨天场景:如果结束时间早于开始时间,说明时段跨到了第二天,给结束时间加一天
- 拿当前时间和转换后的开始、结束时间对比,判断状态
完整代码示例
假设你已经从game_config表中取出了对应游戏的配置数据,以下是可直接复用的代码:
<?php // 模拟从数据库获取的游戏配置(实际项目中用SQL查询替换) $gameConfig = [ 'game_id' => 100, 'start_date' => '03/26/2018', 'start_t' => '10:45', 'start_h' => 'PM', 'end_time' => '12:30', 'end_h' => 'AM', 'status' => 0 ]; // 第一步:设置时区(务必改成你业务需要的时区,比如Asia/Shanghai) date_default_timezone_set('Asia/Shanghai'); // 第二步:转换开始时间为DateTime对象 $startTimeStr = "{$gameConfig['start_date']} {$gameConfig['start_t']} {$gameConfig['start_h']}"; $startTime = DateTime::createFromFormat('m/d/Y h:i A', $startTimeStr); // 第三步:转换结束时间,并处理跨天情况 $endTimeStr = "{$gameConfig['start_date']} {$gameConfig['end_time']} {$gameConfig['end_h']}"; $endTime = DateTime::createFromFormat('m/d/Y h:i A', $endTimeStr); // 如果结束时间早于开始时间,说明时段跨到了第二天,给结束时间加1天 if ($endTime < $startTime) { $endTime->modify('+1 day'); } // 第四步:获取当前时间 $currentTime = new DateTime(); // 第五步:判断时段状态 $periodStatus = ''; // 先判断数据库的status字段(假设0表示正常启用,其他值表示禁用) if ($gameConfig['status'] !== 0) { $periodStatus = '已禁用'; } elseif ($currentTime < $startTime) { $periodStatus = '尚未开始'; } elseif ($currentTime >= $startTime && $currentTime <= $endTime) { $periodStatus = '活跃中'; } else { $periodStatus = '已过期'; } // 输出结果 echo "游戏ID {$gameConfig['game_id']} 的时段状态:{$periodStatus}"; ?>
关键细节说明
- 时间格式解析:用
DateTime::createFromFormat指定格式m/d/Y h:i A,完美匹配数据库里的MM/DD/YYYY日期和12小时制时间 - 跨天处理:通过对比开始和结束时间的DateTime对象,自动识别跨天场景并调整结束日期
- 时区设置:一定要设置正确的时区,否则时间判断会出现偏差(比如服务器默认UTC时区,和国内时间差8小时)
- 复用建议:可以把这段逻辑封装成函数,传入游戏配置数组就能返回状态,方便在项目中多处调用
封装后的函数版本
<?php function getGamePeriodStatus($gameConfig) { // 设置时区 date_default_timezone_set('Asia/Shanghai'); // 转换开始时间 $startTimeStr = "{$gameConfig['start_date']} {$gameConfig['start_t']} {$gameConfig['start_h']}"; $startTime = DateTime::createFromFormat('m/d/Y h:i A', $startTimeStr); // 转换结束时间并处理跨天 $endTimeStr = "{$gameConfig['start_date']} {$gameConfig['end_time']} {$gameConfig['end_h']}"; $endTime = DateTime::createFromFormat('m/d/Y h:i A', $endTimeStr); if ($endTime < $startTime) { $endTime->modify('+1 day'); } $currentTime = new DateTime(); // 判断状态 if ($gameConfig['status'] !== 0) { return '已禁用'; } elseif ($currentTime < $startTime) { return '尚未开始'; } elseif ($currentTime >= $startTime && $currentTime <= $endTime) { return '活跃中'; } else { return '已过期'; } } // 使用示例 $gameConfig101 = [ 'game_id' => 101, 'start_date' => '03/27/2018', 'start_t' => '09:23', 'start_h' => 'AM', 'end_time' => '11:10', 'end_h' => 'AM', 'status' => 0 ]; echo getGamePeriodStatus($gameConfig101); ?>
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

