PHP时间比较逻辑错误排查:密码重置请求时间判断异常
问题分析与修复方案
嘿,我一眼就发现你代码里的两个关键问题啦,这就是为什么逻辑一直走反的原因:
1. 逻辑判断完全搞反了
你的预期逻辑是:
- 若密码重置请求发生在10分钟内 → 显示“请等待10分钟后重试”
- 若请求超过10分钟 → 显示“密码重置邮件已发送”
但你写的条件是:
if($user->getPasswordRequestedAt() <= date("Y-m-d H:i:s", strtotime('-10 minutes')))
这个条件的意思是「如果请求时间早于等于10分钟前」,这时候返回no_resend页面——完全和你的预期逻辑相反!
2. 类型不匹配导致的隐性错误
$user->getPasswordRequestedAt()返回的是**DateTime对象**,而date()函数返回的是字符串。PHP在比较对象和字符串时,会把对象转换成字符串再比较,但这个转换过程可能出现你意想不到的问题,导致比较结果不准确。
修复后的代码
我帮你调整了逻辑,并且统一用DateTime对象来做时间比较,更可靠:
// 创建10分钟前的DateTime对象 $tenMinutesAgo = new \DateTime('-10 minutes'); // 获取用户的密码重置请求时间(DateTime对象) $passwordRequestedAt = $user->getPasswordRequestedAt(); // 额外处理:如果用户从未发起过重置请求(getPasswordRequestedAt()返回null),默认走发送邮件分支 if ($passwordRequestedAt !== null && $passwordRequestedAt >= $tenMinutesAgo) { // 请求发生在10分钟内 → 显示等待重试页面 return $this->render('@User/Resetting/no_resend.html.twig', [ 'username' => $username ]); } else { // 请求超过10分钟,或从未发起过请求 → 显示邮件已发送页面 return $this->render('@User/Resetting/check_email.html.twig', [ 'tokenLifetime' => ceil($this->container->getParameter('fos_user.resetting.retry_ttl') / 60), ]); }
额外说明
我加了$passwordRequestedAt !== null的判断,是因为如果用户从来没发起过密码重置请求,这个值可能是null,直接比较会报错,提前处理能避免这种异常情况。
内容的提问来源于stack exchange,提问作者sonja
相关产品推荐
相关产品推荐

