PHP如何从时间戳索引数组返回时钟时间最早最晚的原始时间戳
实现方案
方案1:单次遍历(推荐,适合大型数组)
仅需遍历数组1次,时间复杂度O(n),性能远高于多次映射或排序方案,核心思路是用时间戳对86400(一天的总秒数)取模直接得到当日时分秒对应的总秒数,同时记录对应的原始时间戳:
// 初始化极值和对应原始时间戳 $minDaySec = 86400; $minOriginalTs = 0; $maxDaySec = -1; $maxOriginalTs = 0; // 时区偏移,如中国东8区填 8*3600,UTC时区填0 $timezoneOffset = 8 * 3600; foreach ($timestamps as $ts) { // 计算当前时间戳对应本地时区的当日总秒数 $currentDaySec = ($ts + $timezoneOffset) % 86400; // 更新最小值 if ($currentDaySec < $minDaySec) { $minDaySec = $currentDaySec; $minOriginalTs = $ts; } // 更新最大值 if ($currentDaySec > $maxDaySec) { $maxDaySec = $currentDaySec; $maxOriginalTs = $ts; } } // 输出结果 echo "时分秒最早的原始时间:" . date('Y-m-d H:i:s', $minOriginalTs) . "\n"; echo "时分秒最晚的原始时间:" . date('Y-m-d H:i:s', $maxOriginalTs) . "\n";
方案2:沿用原有回调思路
如果你希望保留原来的callback处理逻辑,可以将原始时间戳和处理后的时分秒值绑定后再比较:
// 每个元素同时保留原始时间戳和对应时分秒的比较值 $processedList = array_map(function($ts) { return [ 'original' => $ts, 'time_part' => strtotime(date('h:i:s a', $ts)) ]; }, $timestamps); // 按时分秒值排序 usort($processedList, function($a, $b) { return $a['time_part'] <=> $b['time_part']; }); // 取首尾对应的原始时间戳 $minOriginalTs = $processedList[0]['original']; $maxOriginalTs = $processedList[count($processedList) - 1]['original'];
原代码问题说明
原有方案中array_map仅返回了时分秒对应的当日时间戳,原始时间戳在映射后直接丢失,因此min/max返回的是当日的时间戳,输出时自然会显示为当前日期。
内容的提问来源于stack exchange,提问作者Three Year Old
相关产品推荐
相关产品推荐

