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,

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

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

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

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

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

3年前 评论
zozero 3年前
小苏小苏 1年前

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

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

3年前 评论
zozero 3年前
小苏小苏 1年前

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

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

怀疑改错配置

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

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

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

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

3年前 评论

阅读 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年前 评论

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