
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->sortByDesc('CreationDate') 会失败——因为该字段是 dd/mm/yyyy HH:ii:ss 格式的字符串,而非 ISO 标准时间(如 Y-m-d H:i:s)。字符串排序会先比较日(03 vs 23),导致逻辑错误(例如 03/12/2019 被误判为晚于 23/12/2019)。
✅ 正确做法是:使用闭包回调,将每个 CreationDate 字符串通过 DateTime::createFromFormat() 解析为 DateTime 实例,再由 Collection 按其时间戳自然排序:
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);
});⚠️ 注意事项:
- DateTime::createFromFormat() 返回 DateTime|false,若某条数据日期格式异常(如空值、错位),将返回 false 并可能引发排序异常。建议添加容错处理:
$sorted = $collection->sortByDesc(function ($item) { $date = DateTime::createFromFormat('d/m/Y H:i:s', $item->CreationDate); return $date ?: new DateTime('1970-01-01'); // 默认兜底时间 }); - 排序后结果仍为 Collection,如需转回数组或 JSON,可链式调用 ->values()->toArray() 或 ->toJson();
- 若后续需频繁操作日期,推荐在解码后统一转换为 Carbon 实例并存入新属性(如 ->put('created_at', Carbon::createFromFormat(...))),提升可维护性。
总结:字符串日期排序必须显式解析为时间对象。Laravel Collection 的高阶排序能力依赖于 PHP 原生时间类型比较,而非字符串字典序——这是处理本地化日期格式(如西班牙语地区常用的 d/m/Y)的关键实践。










