laravel
的 `sortbydesc()` 默认按字符串排序,导致“03/12/2019”排在“23/12/2019”之后;需使用 `datetime::createfromformat()` 将非标准格式(d/m/y h:i:s)解析为可比较的 datetime 对象后再排序。
在 Laravel 5.5 中对 JSON 数据按日期字段(如 "CreationDate": "23/12/2019 16:49:36")进行
正确降序排序
时,直接调用 $collection-youjiankuohao
php
cnsortByDesc('CreationDate') 会失败——因为该字段是 dd/mm/
yy
yy HH:ii:ss 格式的字符串,而非 ISO 标准时间(如 Y-m-d H:i:s)。字符串排序会先比较日(03 vs 23),导致逻辑错误(例如 03/12/2019 被误判为晚于 23/12/2019)。
✅ 正确做法是:使用闭包回调,将每个 CreationDate 字符串通过 DateTime::createFromFormat() 解析为 DateTime 实例,再由 Collection 按其时间戳自然排序:
⚠️ 注意事项:
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
DateTime::createFromFormat() 返回 DateTime|false,若某条数据日期格式异常(如空值、错位),将返回 false 并可能引发排序异常。建议添加容错处理:
排序后结果仍为 Collection,如需转回数组或 JSON,可链式调用 ->values()->toArray() 或 ->toJson();
若后续需频繁操作日期,推荐在解码后统一转换为 Carbon 实例并存入新属性(如 ->put('created_at', Carbon::createFromFormat(...))),提升可维护性。
总结:字符串日期排序必须显式解析为时间对象。Laravel Collection 的高阶排序能力依赖于 PHP 原生时间类型比较,而非字符串字典序——这是处理
本地化
日期格式(如西班牙语地区常用的 d/m/Y)的关键实践。
use Illuminate\Support\Collection;
use DateTime;
// 解析原始 JSON(注意:你的 JSON 是带双引号的字符串,需先去除外层引号或直接 json_decode)
$json = '[{"NumberCase":"CCS - 102957","CreationDate":"03/12/2019 16:59:19",...}]';
$data = json_decode($json);
$collection = new Collection($data);
$sorted = $collection->sortByDesc(function ($item) {
return DateTime::createFromFormat('d/m/Y H:i:s', $item->CreationDate);
});$sorted = $collection->sortByDesc(function ($item) {
$date = DateTime::createFromFormat('d/m/Y H:i:s', $item->CreationDate);
return $date ?: new DateTime('1970-01-01'); // 默认兜底时间
});