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

PHP中比较两个时间值出现异常,如何正确实现时间比较?

问题分析与解决方案

你的问题出在strtotime()解析仅含时分秒的字符串时的不确定性,以及实际代码中$row['time_in']的解析结果不符合预期。

为什么会出现$time_must更大的情况?

当strtotime()只收到时间字符串(比如"06:45:00 AM")时,它会自动拼接当前服务器的日期。如果$row['time_in']的格式不规范(比如缺少AM/PM标识、格式与测试用例不一致),或者服务器时间刚好处于跨天节点,可能导致strtotime($row['time_in'])解析出的时间戳早于$time_must,出现和预期相反的结果。

修复方案

方案1:固定日期拼接,确保同天比较

把时间和当前日期拼接后再解析,保证两个时间处于同一天,避免跨天问题:

// 取当前日期作为基准
$base_date = date('Y-m-d');
// 拼接日期和规定时间
$time_must = strtotime($base_date . " 06:45:00");
// 拼接日期和实际签到时间
$time_in = strtotime($base_date . " " . $row['time_in']);

if ($time_in > $time_must) {
    echo "You are late.";
}

方案2:使用DateTime类(更可靠)

DateTime类支持明确指定时间格式,避免解析歧义:

// 创建基准日期对象,设置规定时间
$time_must = new DateTime();
$time_must->setTime(6, 45, 0);

// 根据$row['time_in']的实际格式解析,带AM/PM用'h:i:s A',24小时制用'H:i:s'
$time_in = DateTime::createFromFormat('h:i:s A', $row['time_in']);
// 如果是24小时制,替换为下面这行
// $time_in = DateTime::createFromFormat('H:i:s', $row['time_in']);

// 确保实际签到时间和规定时间使用同一天
$time_in->setDate(
    $time_must->format('Y'),
    $time_must->format('m'),
    $time_must->format('d')
);

if ($time_in > $time_must) {
    echo "You are late.";
}

注意事项

  • 确认$row['time_in']的实际格式,确保解析时使用对应的格式字符串(比如h:i:s A对应12小时制带AM/PM,H:i:s对应24小时制)。
  • 尽量避免依赖strtotime()解析不完整的时间字符串,DateTime类的解析逻辑更可控。

内容的提问来源于stack exchange,提问作者user20476491

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 11:48:30