Laravel 使用 Carbon::now() 保存数据的格式与 created_at

问题描述

我正在处理一个 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_atupdated_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,则很可能是配置错误。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...