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

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;
}
为什么这个方案能解决问题?
  1. 精准解析:DateTime::createFromFormat会严格按照你传入的格式(比如mdY H:i)解析日期字符串,完全不受服务器区域设置的影响,保证每个日期都能被正确识别。
  2. 可靠比较:直接比较时间戳的差值,比字符串比较更准确高效。如果$dateB的时间戳更大(也就是日期更新),返回正数会让usort把$b排在$a前面,正好符合你“最新优先”的需求。

用这个函数运行你的测试用例,就能得到你预期的排序结果了。

内容的提问来源于stack exchange,提问作者Mat Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:27:51