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

yajra/laravel-datatables-oracle ^9.20时间戳带毫秒格式异常问题

问题触发原因

yajra/laravel-datatables-oracle ^9.20版本处理Eloquent查询结果时,不会主动修改字段的默认序列化结果。返回值中时间字段携带的.000000是微秒级精度标识,该格式是Laravel框架对Carbon类型时间字段的默认序列化规则:默认输出带微秒精度的ISO8601格式时间字符串,示例中的2018-06-19T23:04:50.000000Z就是该规则的标准输出,不属于组件bug。

修复方案

可根据业务场景选择以下任意一种方案处理:

  • 单接口自定义格式化(推荐,无副作用)
    直接在datatables链式调用中通过editColumn方法单独指定当前接口的时间字段输出格式,仅对当前接口生效,不会影响其他业务逻辑。示例代码:

    $users = User::select(['id', 'name', 'email', 'created_at', 'updated_at']);
    
    return Datatables::of($users)
        ->editColumn('created_at', fn($user) => $user->created_at->format('Y-m-d H:i:s'))
        ->editColumn('updated_at', fn($user) => $user->updated_at->format('Y-m-d H:i:s'))
        ->make(true);
    

    代码中的Y-m-d H:i:s可替换为业务需要的任意格式,若需要保留ISO8601标准格式但去除微秒部分,可将format参数替换为DATE_ATOM常量,或直接调用->toIso8601String()方法。

  • 全局统一序列化格式
    若项目所有接口的时间字段都不需要微秒精度,可在app/Providers/AppServiceProvider.php的boot方法中配置全局Carbon序列化规则,配置后所有Eloquent模型序列化输出的时间字段都会自动遵循该规则,无需逐接口调整。示例代码:

    use Illuminate\Support\Carbon;
    
    public function boot()
    {
        // 配置为常用的年-月-日 时:分:秒格式
        Carbon::serializeUsing(fn($carbon) => $carbon->format('Y-m-d H:i:s'));
    
        // 如果需要保留ISO8601格式仅去除微秒,注释上面一行,放开下面代码即可
        // Carbon::serializeUsing(fn($carbon) => $carbon->toIso8601String());
    }
    
  • 单模型自定义时间格式
    若仅需要调整某一个模型的时间输出格式,可在对应模型类中重写$dateFormat属性,该配置会同时作用于模型的读、写时间格式。示例代码:

    class User extends Model
    {
        protected $dateFormat = 'Y-m-d H:i:s';
    }
    

    注意:该配置会同步影响时间字段写入数据库的格式,若数据库时间字段类型和配置格式不匹配会触发写入错误,非特殊场景不优先选择该方案。


内容的提问来源于stack exchange,提问作者Joyanta sarkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:21:20