问题描述
我正在处理一个 Laravel 项目和时区(我知道时区很痛苦),发生的事情是我的表中的一个自定义列,名为 last_checked
的列是存储为 timestamp
的格式似乎与 created_at
不同,这意味着我的时区解析根本没有解析用户时区的日期。
这就是我的意思...
存储记录时,我设置了日期和时间:
$uptimeMonitor = Monitors::where('id',$monitor['id'])
->get()
->first();
$uptimeMonitor->last_checked = Carbon::Now();
$uptimeMonitor->save();
但是当我检索结果时,查看我的网络请求,我看到了这种格式:
2021-04-05 11:46:54
但是当我同时查看 created_at
和 updated_at
列时,它们的格式如下:
2021-04-05T10:01:16.000000Z
所以这里的问题是,我保存数据时做错了什么?两种格式在数据库中的显示方式似乎相同,但由于某些奇怪的原因,第一个示例没有正确解析。
解决方法
Carbon 使用默认的 DateTime PHP 对象,因此使用 date_default_timezone_set() 函数,例如: date_default_timezone_set('UTC');
或者你定义它AppServiceProvider
App/Providers/AppServiceProvider.php
public function boot()
{
date_default_timezone_set('UTC');
}
或者你可以用setTimezone
的碳法
echo Carbon::now()->setTimezone('UTC')->format('H:i');
试试这个
$uptimeMonitor = Monitors::where('id',$monitor['id'])
->get()
->first();
$uptimeMonitor->last_checked = Carbon::now()->setTimezone('UTC')->format('Y-m-d H:i:s');
$uptimeMonitor->save();
注意我的默认应用时区是 UTC
只需找到您的默认时区
并将其设置在 `setTimezone('UTC');
您需要在您的 $casts
模型保护成员中添加所有日期时间属性:
https://laravel.com/docs/8.x/eloquent-mutators#date-casting
在您的数据库中一切正常,只是 Laravel 模型必须知道它是一个日期,以便在您的 JSON 中使用完整的 ISO-8601 字符串进行格式化。
旁注,您仍然应该在 config/app.php 中将“UTC”作为默认值,它不会阻止对特定情况进行任何时区处理,或者相反地处理用户时区。
如果您的日期默认输出字符串为 GMT+1,则很可能是配置错误。