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

PHP日期转Unix时间戳计算时间差出现异常结果求助

问题分析与修复

问题根源

你的代码中$dateTimeNow = date();使用了date()函数的默认格式,生成的字符串类似Wed Jan 4 09:37:51 UTC 2023。这种格式在部分场景下会导致strtotime($dateTimeIn)解析失败,返回false。在数值运算中false会被转换为0,最终计算的是从Unix纪元(1970-01-01)到偏移后日期的总天数,而非两个目标日期的差值,这就是你得到19361天错误结果的原因。

修复方案

  1. 明确指定date()的输出格式为Y-m-d H:i:s,确保strtotime()能稳定解析;
  2. 直接使用strtotime生成的时间戳计算差值,避免多次字符串与时间戳的转换,提升效率同时减少出错可能。

修复后的代码

<?php
// 指定明确的日期格式,确保strtotime可正确解析
$dateTimeNow = date("Y-m-d H:i:s");

function dateTimeShift($dateTimeIn, $lengthNum, $lengthWord) {
    // 直接获取原始时间戳和偏移后的时间戳
    $originalTimestamp = strtotime($dateTimeIn);
    $shiftedTimestamp = strtotime("$dateTimeIn + $lengthNum $lengthWord");
    $difference = $shiftedTimestamp - $originalTimestamp;
    
    // 格式化偏移后的日期
    $shifted = date("Y-m-d H:i:s", $shiftedTimestamp);
    
    // 处理单复数,让输出更严谨
    $dayText = floor($difference/86400) . " day" . (floor($difference/86400) != 1 ? "s" : "");
    $hourText = floor($difference/3600) . " hour" . (floor($difference/3600) != 1 ? "s" : "");
    
    return $shifted . " > " . $dayText . " or " . $hourText;
}

echo dateTimeShift($dateTimeNow, "1", "day");
?>

效果说明

修复后代码会输出预期结果:2023-01-04 09:37:51 > 1 day or 24 hours,同时额外处理了单复数格式,让输出更符合自然语言习惯。

内容的提问来源于stack exchange,提问作者Glen Keybit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:50:22