PHP如何比较两个时间?数据库时间与当前时间对比全部返回false排查
问题原因
- 核心错误:数组结构异常:你定义的
$data[] = array();是二维数组结构,如果后续往$data中插入数据时错误塞入了数组而非直接插入时间字符串,遍历的时候拿到的$val就是数组而非H:i格式的字符串,拼接后的时间会变成Y-m-d Array,strtotime()解析失败返回false。PHP中false和数字对比时会被转为0,小于任何正常的时间戳,所以所有对比结果都是false。 var_dump()使用错误:var_dump()是直接打印输出的函数,没有返回值,你把它写在echo语句中会导致输出顺序错乱(布尔值先打印,再打印时间字符串),干扰你对实际对比结果的判断。- 时区未显式配置:PHP默认时区如果和你所在的时区不一致,会导致
date()获取的当前时间和实际本地时间存在时差,导致对比逻辑不符合预期。
修正方案
首先确认你的$data是一维数组,每个元素直接是H:i格式的时间字符串,正确的数组赋值示例:$data[] = '00:05'; 而非$data[] = ['00:05'];。
修正后的代码如下:
// 先配置对应时区,国内使用Asia/Shanghai即可 date_default_timezone_set('Asia/Shanghai'); // 直接取当前时间戳,不需要转字符串再解析,性能更高 $timenow = time(); foreach($data as $key=>$val){ // 去除时间字符串前后多余空格 $val = trim($val); // 校验时间格式是否合法 if (!preg_match('/^\d{2}:\d{2}$/', $val)) { echo "无效的时间格式:" . var_export($val, true) . "<hr />"; continue; } $time = strtotime(date("Y-m-d") . " " . $val); // 可选业务逻辑:如果当天的时间已经小于当前时间,自动加1天顺延到次日,根据自身需求决定是否开启 // if ($time < $timenow) { // $time += 86400; // } $res = $time >= $timenow; // 使用var_export的返回值模式,保证输出顺序正确 echo date("Y-m-d H:i", $time) . " >= " . date("Y-m-d H:i", $timenow) . " " . var_export($res, true) . "<hr />"; }
内容的提问来源于stack exchange,提问作者Wilf
相关产品推荐
相关产品推荐

