日期序列化后,Laravel 7中的时区错误



我正在开发一款新的Laravel 7.1应用程序(不是升级版(但是,使用日期序列化似乎会放松时区。

config/app.php

'timezone' => 'Europe/Zurich',

修补示例

>>> CarbonCarbon::parse('2020-06-22')->timezone
=> CarbonCarbonTimeZone {#3251
timezone: Europe/Zurich (+01:00),
}

Laravel 7使用toJson((

>>> CarbonCarbon::parse('2020-06-22')->toJson()
=> "2020-06-21T22:00:00.000000Z"

所以,当我解析回日期时,我没有得到正确的日期。

>>> new CarbonCarbon('2020-06-21T22:00:00.000000Z')
=> CarbonCarbon @1592776800 {#3266
date: 2020-06-21 22:00:00.0 +00:00,
timezone: "Z",
}
>>> (new CarbonCarbon('2020-06-21T22:00:00.000000Z'))->format('Y-m-d')
=> "2020-06-21"

目前我是这样做的

$date = Carbon::parse('2020-06-21T22:00:00.000000Z')
->setTimezone(config('app.timezone'));

作为替代方案,我可以更改我的模型中的默认日期格式,如文档中所述

/**
* Prepare a date for array / JSON serialization.
*
* @param  DateTimeInterface  $date
* @return string
*/
protected function serializeDate(DateTimeInterface $date)
{
return $date->toIso8601String(); // 2019-02-01T03:45:27+00:00
}

但我想,Carbon::parse()和/或new Carbon()默认占用我的时区会更好

这里也有同样的问题。

当从Laravel 6升级时->7,这个改变了。(请参阅此处(序列化时,时间从本地时间更新为UTC(根据ISO-8601(
但是当将相同的sting返回到php时,Carbon对象不使用ISO-8601时区表示。

问题1:

更新到数据库时,此日期每次都会随着您的时区设置而移动。

问题2:

在浏览器中显示时间戳时,必须使用(浏览器(时区设置来固定此字段的每个表示形式。

修复:

升级手册提出了一个修复方案
我们在所有模型中都使用了一个特性,因此我们在那里进行了更新:

如果您想继续使用以前的行为,可以覆盖模型上的serializeDate方法:

use DateTimeInterface;
/**
* Prepare a date for array / JSON serialization.
*
* @param  DateTimeInterface  $date
* @return string
*/
protected function serializeDate(DateTimeInterface $date)
{
return $date->format('Y-m-d H:i:s');
}

当然,对所有内容都使用UTC会更好,但这需要从JSON(ajax(中进行回读。将使用与序列化相同的时区设置/差异。