PHP中用strtotime判断24小时是否已过结果异常的解决咨询
正确实现PHP中24小时时间差校验的方案
问题根源分析
你之前的代码不管是最初版本还是更新后的版本,核心问题都是丢失了时间的时分秒信息:
- 把带具体时间的时间戳/日期转成了仅包含
d-m-Y格式的字符串,strtotime解析这种字符串时会默认填充为当天的00:00:00 - 只要当前日期和
approved_date的日期相同,当前时间戳(哪怕是当天1点)都会比approved_date转成的0点时间戳大,导致即使没到24小时也触发逻辑 - 另外更新后的
if表达式存在逻辑优先级错误:||的优先级低于&&,实际执行逻辑会偏离你的预期,需要用括号明确分组
正确实现方案
方案一:直接用时间戳差值计算(高效简洁)
既然数据库里存的是time()生成的整数时间戳,直接计算当前时间戳与审批时间戳的差值,判断是否超过24小时对应的秒数(86400秒):
// 从数据库取出审批时间戳 $approvedTimestamp = $customer_details['approved_date']; // 获取当前时间戳 $currentTimestamp = time(); // 判断是否超过24小时 $isOver24Hours = ($currentTimestamp - $approvedTimestamp) > 86400; // 修正逻辑表达式的括号,明确优先级(根据你的实际需求调整逻辑) if ($isOver24Hours && empty($customer_details['last_password_reset']) && !(bool)$customer_details['account_details_sent'] ) { // 执行邮件发送等操作 }
方案二:使用DateTime对象的diff方法(直观易扩展)
如果需要更灵活的时间判断(比如考虑时区、更精细的时间间隔),可以用PHP的DateTime对象计算时间差:
// 从时间戳创建审批时间对象 $approvedDate = new DateTime("@{$customer_details['approved_date']}"); // 当前时间对象 $currentDate = new DateTime(); // 计算时间间隔 $interval = $currentDate->diff($approvedDate); // 判断是否超过24小时:天数>0,或者小时数>24,或者小时数=24但有分钟/秒的差值 $isOver24Hours = ($interval->d > 0) || ($interval->h > 24) || ($interval->h == 24 && ($interval->i > 0 || $interval->s > 0)); // 修正逻辑表达式的括号 if ($isOver24Hours && empty($customer_details['last_password_reset']) && !(bool)$customer_details['account_details_sent'] ) { // 执行邮件发送等操作 }
补充说明
- 关于逻辑表达式:原代码中的
!(bool)$customer_details['account_details_sent'] || empty($customer_details['account_details_sent'])存在逻辑冗余,empty()本身就会判断值是否为空/假,你可以根据实际需求简化为!$customer_details['account_details_sent'] - 尽量避免在时间比较中转换为日期字符串,直接使用时间戳或DateTime对象可以保留完整的时间信息,避免误判
内容的提问来源于stack exchange,提问作者OHICT
相关产品推荐
相关产品推荐

