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

如何用PHP判断用户指定的起止时间是否过期(附库结构与示例代码)

判断游戏时段是否活跃/过期的PHP实现方案

嘿,我来帮你搞定这个时段判断的问题!首先得处理数据库里那些12小时制的时间格式,尤其是跨天的情况(比如你例子里游戏ID100,从晚上10:45到凌晨12:30,这时候结束日期其实是第二天),直接字符串对比很容易出错,用PHP的DateTime类来处理是最稳妥的。

核心思路

  1. 把数据库里的分散日期、时间字段组合成完整的时间字符串,转成DateTime对象
  2. 处理跨天场景:如果结束时间早于开始时间,说明时段跨到了第二天,给结束时间加一天
  3. 拿当前时间和转换后的开始、结束时间对比,判断状态

完整代码示例

假设你已经从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:18:06