Ajax DataTable显示[object Object]而非时间格式问题求助
解决DataTable中timestamp字段显示[object Object]的问题
这个问题我之前也碰到过!原因是Laravel默认会把created_at和updated_at字段封装成Carbon日期对象,当通过AJAX返回JSON时,这个对象会被序列化成包含date、timezone等属性的JSON对象,而不是直接的日期字符串,所以DataTable直接渲染就会显示[object Object]。下面给你两种解决方案,选哪种看你的需求:
方法一:后端直接返回格式化后的日期字符串
如果你希望所有调用这个接口的地方都拿到统一格式的日期,可以在Laravel模型或控制器里处理:
方案1:在模型中配置日期格式化
在你的对应模型(比如CustContinfo)里添加$casts属性,指定日期字段的输出格式:
class CustContinfo extends Model { // ... 其他代码 protected $casts = [ 'created_at' => 'datetime:Y-m-d H:i:s', 'updated_at' => 'datetime:Y-m-d H:i:s', ]; }
这样当模型转成JSON时,created_at和updated_at会直接变成你指定格式的字符串,前端DataTable不需要任何修改就能正常显示。
方案2:在控制器中手动格式化
如果不想修改模型全局配置,也可以在返回数据时单独处理这两个字段:
// 假设你在控制器中查询数据的代码 $continfos = CustContinfo::select('id', 'receipt_date', 'info_division_name', 'contact_status', 'note', 'created_at', 'updated_at')->get(); // 格式化日期字段 $continfos->transform(function ($item) { $item->created_at = $item->created_at->format('Y-m-d H:i:s'); $item->updated_at = $item->updated_at->format('Y-m-d H:i:s'); return $item; }); return response()->json($continfos);
方法二:前端DataTable中通过render函数处理
如果不想改动后端代码,直接在前端DataTable的列配置里用render函数解析JSON日期对象:
修改你原代码中的columns部分,把created_at和updated_at列的配置改成下面这样:
"columns": [ { "data": "id" }, { "data": "receipt_date" }, { "data": "info_division_name" }, { "data": "contact_status" }, { "data": "note" }, { "data": "created_at", "render": function(data, type, row) { // Carbon序列化后的对象包含date字段,直接取这个值 return data ? data.date : '-'; // 如果需要转换成本地时间格式,可以用: // return data ? new Date(data.date).toLocaleString() : '-'; } }, { "data": "updated_at", "render": function(data, type, row) { return data ? data.date : '-'; } } ],
这样DataTable渲染时会自动把日期对象转换成你需要的字符串格式。
两种方法对比
- 后端处理:优点是全局统一,所有调用该接口的地方都能拿到格式化后的日期;缺点是灵活性稍弱,如果不同页面需要不同格式的日期,还要额外处理。
- 前端处理:优点是灵活,可以根据当前页面需求自定义日期格式;缺点是每个用到该接口的DataTable都要写一遍render逻辑。
你可以根据自己的实际场景选择合适的方案~
内容的提问来源于stack exchange,提问作者andil01
相关产品推荐
相关产品推荐

