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
相关产品推荐
相关产品推荐

