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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:43:19