gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:16:39 26 4
gpt4 key购买 nike

我正在开发一个新的 Laravel 7.1 应用程序(不是升级)
但似乎使用日期序列化会丢失时区。

config/app.php

'timezone' => 'Europe/Zurich',

修补程序示例
>>> \Carbon\Carbon::parse('2020-06-22')->timezone
=> Carbon\CarbonTimeZone {#3251
timezone: Europe/Zurich (+01:00),
}

Laravel 7 uses toJson()
>>> \Carbon\Carbon::parse('2020-06-22')->toJson()
=> "2020-06-21T22:00:00.000000Z"

所以,当我解析日期时,我没有得到正确的日期。
>>> new \Carbon\Carbon('2020-06-21T22:00:00.000000Z')
=> Carbon\Carbon @1592776800 {#3266
date: 2020-06-21 22:00:00.0 +00:00,
timezone: "Z",
}

>>> (new \Carbon\Carbon('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'));

作为替代方案,我可以更改模型中的默认日期格式,如 doc 中所述。
/**
* 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 升级时,这已更改。 (见 here)
序列化时,时间从本地时间更新为 UTC(根据 ISO-8601)。
但是当将相同的字符串返回给 php 时,Carbon 对象不使用 ISO-8601 时区表示。
问题1:
更新到数据库时,此日期每次都会随您的时区设置一起移动。
问题2:
在浏览器中显示时间戳时,此字段的每个表示都必须使用(浏览器)时区设置进行修复。
使固定:
升级手册提出fix .
我们在所有模型中都使用了一个 trait,所以我们在那里更新了:

If you would like to keep using the previous behavior you can overridethe serializeDate method on your model:

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) 回读将使用与序列化相同的时区设置/差异。

关于php - 日期序列化后 Laravel 7 中的时区错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60649769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com