PHP mdY格式日期数组排序失效问题排查
问题根源:strtotime无法正确识别你的日期格式
你遇到的排序无效问题,核心原因是**strtotime没办法准确解析你这种无分隔符的自定义日期格式**。
比如你输入的"09082020 00:00",strtotime会根据服务器的区域设置去猜测格式,很可能解析错误甚至返回false。之后你用date('dmY H:i', strtotime($a))得到的结果,要么是错误的日期字符串,要么所有值都变成了1970年的默认日期——这样所有元素比较起来都相等,usort自然不会改变数组的原始顺序。
修正方案:用
DateTime::createFromFormat精准解析日期 想要可靠地排序自定义格式的日期,必须用DateTime::createFromFormat来明确指定日期格式,这样就能避免自动解析的误差。下面是修正后的排序函数:
function orderDates($items) { // 按最新日期优先排序 usort($items, function ($a, $b) { // 这里的格式要和你的输入日期格式严格对应! // 你说输入是mdY H:i,所以格式参数是'mdY H:i' $dateA = DateTime::createFromFormat('mdY H:i', $a); $dateB = DateTime::createFromFormat('mdY H:i', $b); // 可选:处理解析失败的异常情况(比如输入格式错误) if (!$dateA || !$dateB) { return 0; } // 通过时间戳差值实现倒序排序,最新的日期排在前面 return $dateB->getTimestamp() - $dateA->getTimestamp(); }); return $items; }
为什么这个方案能解决问题?
- 精准解析:
DateTime::createFromFormat会严格按照你传入的格式(比如mdY H:i)解析日期字符串,完全不受服务器区域设置的影响,保证每个日期都能被正确识别。 - 可靠比较:直接比较时间戳的差值,比字符串比较更准确高效。如果
$dateB的时间戳更大(也就是日期更新),返回正数会让usort把$b排在$a前面,正好符合你“最新优先”的需求。
用这个函数运行你的测试用例,就能得到你预期的排序结果了。
内容的提问来源于stack exchange,提问作者Mat Johnson
相关产品推荐
相关产品推荐

