PHP计算分钟级时间差异常:始终返回true问题求助
问题分析与解决方案
你的代码始终返回true的核心原因是**strtotime无法正确解析d-m-Y H:i:s A这种日-月-年格式的字符串**,导致后续时间计算完全偏离预期。
为什么原代码失效?
strtotime默认优先识别美式日期格式(mm-dd-yyyy),当你传入31-01-2018时,它会错误地把31当成月份——显然没有31月,所以strtotime($added_date)会返回false。
接下来你执行strtotime("+10 minutes", false),由于第二个参数是false,函数会默认以当前时间为基准加10分钟,最终$endTime变成了「当前时间+10分钟」。这时候计算abs($currentTime - $endTime)的结果必然小于10分钟,所以你的判断条件永远不触发echo false,一直返回true。
修复方案:用DateTime类处理(更可靠)
对于非标准/本地化的日期格式,推荐使用PHP的DateTime类,它支持指定格式解析,完全避免strtotime的解析歧义。
修正后的代码如下:
<?php $added_date = "31-01-2018 12:46 PM"; // 1. 按照指定格式解析原始日期字符串 $endTimeObj = DateTime::createFromFormat('d-m-Y h:i A', $added_date); // 2. 给原始时间加上10分钟 $endTimeObj->add(new DateInterval('PT10M')); // 3. 获取当前时间 $currentTimeObj = new DateTime(); // 计算两个时间的差值 $diff = $currentTimeObj->diff($endTimeObj); // 把差值转换为总分钟数 $totalMinutes = $diff->days * 24 * 60 + $diff->h * 60 + $diff->i; // 判断逻辑:当前时间晚于endTime且差值超过10分钟,返回false;否则返回true if ($diff->invert && $totalMinutes > 10) { echo 'false'; } else { echo 'true'; } ?>
关键细节说明
DateTime::createFromFormat('d-m-Y h:i A', $added_date):严格按照「日-月-年 12小时制时间 上午/下午」的格式解析字符串,确保不会出错。$diff->invert:这个属性用来判断时间差的方向——值为1表示当前时间晚于endTime,值为0表示当前时间早于或等于endTime。结合总分钟数的判断,就能准确实现你的需求。
替代方案:用date_create_from_format函数
如果你习惯用 procedural 风格的代码,也可以用date_create_from_format实现同样的逻辑:
<?php $added_date = "31-01-2018 12:46 PM"; $addedTime = date_create_from_format('d-m-Y h:i A', $added_date); $endTime = date_add($addedTime, date_interval_create_from_date_string('10 minutes')); $currentTime = new DateTime(); $diff = date_diff($currentTime, $endTime); $totalMinutes = $diff->days * 24 * 60 + $diff->h * 60 + $diff->i; if ($diff->invert && $totalMinutes > 10) { echo 'false'; } else { echo 'true'; } ?>
内容的提问来源于stack exchange,提问作者user5443928
相关产品推荐
相关产品推荐

