Laravel7 Model 返回时间格式及时区不正确

环境Laravel7+PHP7.3.8
php.ini时区正确(Asia/Shanghai)、Laravel时区也正确(RPC)、数据库中存储的时间戳正确。
当使用Model查询时,返回的时间为UTC时间

$member = Member::firstOrCreate($where, $data);
return \Response::json($member);
{
    "msg": "",
    "data": {
        "edittime": "2020-03-30T02:37:31.000000Z",
        "regtime": "2020-03-30T02:37:31.000000Z",
    },
    "code": 1
}

使用tinker交互返回的正确时间(正确情况应该如下)

(base) ➜  dlf  ✗ php artisan tinker     
Psy Shell v0.10.2 (PHP 7.3.8 — cli) by Justin Hileman
>>> Carbon\Carbon::now();
=> Carbon\Carbon @1585536738 {#3083
     date: 2020-03-30 10:52:18.609379 Asia/Shanghai (+08:00),
     timezone_type: 3,
     timezone: "Asia/Shanghai",
   }
>>> echo date('Y-m-d H:i:s', time());
2020-03-30 10:52:21>>> 

返回的时区不对,目前可以用修改器解决,但是感觉不很繁琐,修改器意味着只要返回时间都要加修改器。

Laravel7时间格式为ISO-8601,

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

在你的模型文件中指定格式

protected $casts = [
        'edittime' => 'datetime:Y-m-d H:i:s',
        'regtime' => 'datetime:Y-m-d H:i:s'
];
4年前 评论
家猪配种专家 (作者) 4年前
MyPuppet (楼主) 4年前
MyPuppet (楼主) 4年前
家猪配种专家 (作者) 4年前
MyPuppet (楼主) 4年前
MyPuppet (楼主) 4年前
家猪配种专家 (作者) 4年前
MyPuppet (楼主) 4年前
fy_kenny 3年前
Livon 2年前
讨论数量: 34

laravel 7 有个不兼容的改动,按照文档调整代码就行了

升级说明《Laravel 7 中文文档》

4年前 评论
zozero 3年前
小苏小苏 2年前

laravel 7 有个不兼容的改动,按照文档调整代码就行了

升级说明《Laravel 7 中文文档》

4年前 评论
zozero 3年前
小苏小苏 2年前

在你的模型文件中指定格式

protected $casts = [
        'edittime' => 'datetime:Y-m-d H:i:s',
        'regtime' => 'datetime:Y-m-d H:i:s'
];
4年前 评论
家猪配种专家 (作者) 4年前
MyPuppet (楼主) 4年前
MyPuppet (楼主) 4年前
家猪配种专家 (作者) 4年前
MyPuppet (楼主) 4年前
MyPuppet (楼主) 4年前
家猪配种专家 (作者) 4年前
MyPuppet (楼主) 4年前
fy_kenny 3年前
Livon 2年前

怀疑改错配置

4年前 评论
MyPuppet (楼主) 4年前
Hanson (作者) 4年前
MyPuppet (楼主) 4年前
pigzzz 4年前
Hanson (作者) 4年前
pigzzz 4年前
Hanson (作者) 4年前
MyPuppet (楼主) 4年前

这不是格式问题吗?关时区什么事?

4年前 评论
MyPuppet (楼主) 4年前
DDDecade (作者) 4年前
    /**
     * 为数组 / JSON 序列化准备日期。
     *
     * @param \DateTimeInterface $date
     * @return string
     */
    protected function serializeDate(DateTimeInterface $date)
    {
        return $date->format($this->dateFormat ?: 'Y-m-d H:i:s');
    }
4年前 评论
protected function serializeDate(\DateTimeInterface $date)
{
    return Carbon::instance($date)->toDateTimeString();
}

把这个方法里面的方法换了

4年前 评论

阅读 laravel7 升级说明 --- 日期序列化

3年前 评论

我只是将 config/app.php 中,timezone 设置为 PRC 就可以。

3年前 评论
KevinChengjian 3年前
leslieeilsel (作者) 3年前

出现这种格式的时间可以在 从数据库中取出时间的时候进行toDateTimeString()操作,这样转化过来的时间格式就是你想要的啦~

Carbon::now()->toDateTimeString(); //2020-10-10 16:17:50
因为模型取出来的时间戳是个Carbon对象,你可以调用Carbond的方法来更改成你想要的格式;而且这不仅仅是laravel7的问题,我在使用laravel5.8的版本也遇到了这个问题。

$dataArr = [];
foreach ($data as $key => $value) {
    $crtdt = $value->created_at->toDateTimeString();
    $udtdt = $value->updated_at->toDateTimeString();
    array_push($dataArr, [
        'star' => $value->star,
        'money' => $value->money,
        'grade' => $value->grade,
        'remarks' => $value->remarks,
        'created_at' => $crtdt,
        'updated_at' => $udtdt,
    ]);
}
return $dataArr;
3年前 评论
陈先生

不过如果这个datetime是在中间表的话,在跨表查询的时候 belongtomany的时候中间表的时间戳 好像无法修改了就

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!