PHP重复函数优化:如何同时处理两个UNIX时间戳?
优化你的时间戳处理代码:消除冗余,复用逻辑
看起来你现在的问题是写了两段几乎完全重复的代码来处理两个时间戳,其实完全可以通过复用单一函数来简化操作,同时还能去掉不必要的时间戳转换步骤。我来帮你重构一下:
第一步:提取时间戳(跳过冗余转换)
首先,你从JSON里拿到的timecreated和lastlogoff本身就是UNIX时间戳,不需要先转成日期字符串再转回来——这一步完全是多余的,直接用原始值就行:
// 从JSON中直接获取两个时间戳 $accountCreatedTimestamp = $json["response"]["players"][0]["timecreated"]; $lastLogoffTimestamp = $json["response"]["players"][0]["lastlogoff"];
第二步:写一个通用的时间转换函数
只需要写一次humanTiming函数,它接收任意UNIX时间戳作为参数,返回格式化后的“多久之前”文本:
function humanTiming($timestamp) { // 计算当前时间与目标时间的差值 $timeElapsed = time() - $timestamp; // 确保差值至少为1秒,避免出现负数或0的情况 $timeElapsed = max($timeElapsed, 1); // 定义时间单位与对应秒数的映射 $timeUnits = [ 31536000 => 'year', 2592000 => 'month', 604800 => 'week', 86400 => 'day', 3600 => 'hour', 60 => 'minute', 1 => 'second' ]; // 遍历找到最合适的时间单位 foreach ($timeUnits as $unitSeconds => $unitName) { if ($timeElapsed < $unitSeconds) { continue; } $unitCount = floor($timeElapsed / $unitSeconds); // 处理复数形式 return $unitCount . ' ' . $unitName . ($unitCount > 1 ? 's' : ''); } }
第三步:复用函数处理两个时间戳
现在只需要调用同一个函数,传入不同的时间戳就能得到结果:
// 处理账号创建时间 $accountCreatedAgo = humanTiming($accountCreatedTimestamp); // 处理最后离线时间 $lastLogoffAgo = humanTiming($lastLogoffTimestamp); // 示例输出 echo "账号创建于:{$accountCreatedAgo} 前<br>"; echo "最后离线于:{$lastLogoffAgo} 前";
优化点说明
- 消除代码冗余:不用再写两个几乎一样的函数,后续修改逻辑只需要改这一个函数即可
- 去掉无效转换:跳过
gmdate再strtotime的循环转换,直接使用原始时间戳,提升性能 - 提升可读性:用更清晰的变量名(比如
accountCreatedTimestamp)替代模糊的epoch_jd,代码更易维护
内容的提问来源于stack exchange,提问作者user7901129
相关产品推荐
相关产品推荐

