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

PHP按d/m/Y H:i:s格式StartTime对数组排序失败求助

问题分析与解决

你的代码排序失效的核心原因是:错误地将DateTime对象传入strtotime()函数——这个函数需要接收日期字符串而非对象,虽然PHP会自动将DateTime转为字符串,但这种操作多余且可能在解析失败时导致错误(比如createFromFormat返回false时,strtotime(false)会得到0,导致所有元素排序值相同)。

以下是两种正确的实现方式:

方法一:直接比较DateTime对象

PHP的DateTime对象支持太空船运算符(<=>)直接比较,写法简洁且直观:

$client = [
    [
        'LessonId' => 1,
        'StartTime' => '20/11/2022 10:30:00',
        'EndTime' => '20/11/2022 11:30:00',
        'LessonName' => 'Dance',
    ],
    [
        'LessonId' => 2,
        'StartTime' => '20/11/2022 09:30:00',
        'EndTime' => '20/11/2022 10:30:00',
        'LessonName' => 'Dance',
    ],
];

usort($client, function ($a, $b) {
    $dateA = \DateTime::createFromFormat('d/m/Y H:i:s', $a['StartTime']);
    $dateB = \DateTime::createFromFormat('d/m/Y H:i:s', $b['StartTime']);
    
    // 可选:处理日期解析失败的情况,将无效日期排到末尾
    if (!$dateA) return 1;
    if (!$dateB) return -1;
    
    return $dateA <=> $dateB;
});

方法二:使用DateTime的时间戳比较

如果你更习惯用Unix时间戳排序,可以调用getTimestamp()方法获取正确的时间戳,替代多余的strtotime():

usort($client, function ($a, $b) {
    $dateA = \DateTime::createFromFormat('d/m/Y H:i:s', $a['StartTime']);
    $dateB = \DateTime::createFromFormat('d/m/Y H:i:s', $b['StartTime']);
    
    $pos_a = $dateA ? $dateA->getTimestamp() : PHP_INT_MAX;
    $pos_b = $dateB ? $dateB->getTimestamp() : PHP_INT_MAX;
    
    return $pos_a <=> $pos_b;
});

总结:不需要用strtotime()配合createFromFormat,createFromFormat已经完成了字符串到日期对象的解析,直接用对象或其时间戳即可完成排序。

内容的提问来源于stack exchange,提问作者Jorn Reed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:25:24