PHP日期转Unix时间戳计算时间差出现异常结果求助
问题分析与修复
问题根源
你的代码中$dateTimeNow = date();使用了date()函数的默认格式,生成的字符串类似Wed Jan 4 09:37:51 UTC 2023。这种格式在部分场景下会导致strtotime($dateTimeIn)解析失败,返回false。在数值运算中false会被转换为0,最终计算的是从Unix纪元(1970-01-01)到偏移后日期的总天数,而非两个目标日期的差值,这就是你得到19361天错误结果的原因。
修复方案
- 明确指定
date()的输出格式为Y-m-d H:i:s,确保strtotime()能稳定解析; - 直接使用
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
相关产品推荐
相关产品推荐

