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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:03:35