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

Laravel时区配置异常:dd()显示正常但返回结果为UTC

解决Laravel中Carbon返回数组时时区变为UTC的问题

问题根源

当你用dd(now())输出时,Carbon实例直接展示的是配置时区的时间,但当Carbon实例被自动序列化为数组或JSON(比如返回API响应)时,Carbon默认会把时间转成UTC时区的ISO格式字符串——这是它的默认序列化行为导致的,和你配置的全局时区无关。

解决方案

1. 全局统一设置Carbon序列化时区

在app/Providers/AppServiceProvider.php的boot方法中添加以下代码,让所有Carbon实例在序列化时自动使用你配置的时区:

public function boot()
{
    \Carbon\Carbon::serializeUsing(function ($carbon) {
        return $carbon->tz(config('app.timezone'))->toIso8601String();
    });
}

添加后,所有返回数组/JSON中的Carbon时间都会自动匹配app.timezone配置的时区。

2. 针对单个Carbon实例处理

如果不需要全局修改,仅针对特定时间实例,可以手动指定时区后再转换:

// 直接转换为数组时指定时区
$time = now()->tz(config('app.timezone'))->toArray();

// 或者在返回数组时单独处理字段
return [
    'current_time' => now()->tz(config('app.timezone'))->format('Y-m-d H:i:s'),
    'created_at' => $model->created_at->tz(config('app.timezone'))->toIso8601String(),
];

3. 模型日期字段统一处理

如果是Eloquent模型的日期字段(如created_at、updated_at),可以在模型中重写serializeDate方法,让模型转数组时日期字段自动使用配置时区:

use Illuminate\Database\Eloquent\Model;
use DateTimeInterface;

class YourModel extends Model
{
    protected function serializeDate(DateTimeInterface $date)
    {
        return $date->tz(config('app.timezone'))->format('Y-m-d H:i:s');
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:20:03