我的 Laravel 应用程序中的时间戳存在问题。我们的数据库以 CEST 格式存储时间戳,但是当我将它们转换为
datetime
对象时,Laravel 会自动将它们转换为 UTC,即使我的 timezone
在配置文件中设置为 CEST
。
'timezone' => 'Europe/Brussels',
这是我如何投射它的示例:
protected $casts = [
'new' => 'datetime'
];
当我不投射到
datetime
时,问题就会消失,但对于应用程序的某些部分,我需要datetime
格式。
我知道我可以像这样手动转换它:
Carbon::parse($new)->setTimezone('CEST')
但我想避免每次都手动进行这种转换。有没有办法将其转换为
datetime
并自动使用 CEST 而不是 UTC?
任何关于为什么会发生这种情况以及如何解决它的帮助或解释将不胜感激!
以 UTC 格式存储时间戳: 通常,最佳实践是以 UTC 格式存储所有时间戳,并让 Laravel 根据应用程序的配置自动处理时区转换。这确保了不同环境和服务器之间的一致性。
投射后手动调整: 如果无法选择以 UTC 存储,您可以在投射后调整时区,如下所示:
protected $casts = [
'new' => 'datetime:Y-m-d H:i:s',
];
public function getNewAttribute($value)
{
return \Carbon\Carbon::parse($value)->timezone('Europe/Brussels');
}
这将确保新属性显示在 CEST 中。
使用数据库时区设置:确保您的数据库设置为使用 UTC(或在插入时显式转换为 UTC)并依赖 Laravel 的时区配置进行输出。