Laravel自动添加时间

问题描述

我的Laravel应用程序似乎有问题,我一生无法弄清楚发生了什么。

我的MysqL数据库中有一个简单的日期字段,其数据类型仅为date,对于本示例,该值为2020-08-13,但是由于某种原因,当我尝试访问日期时,最后添加时间戳,减少1天,并引发Carbon尾随数据错误

肯定是这个日期,因为当我软删除它时,错误消失了。

例如,此日期的错误

Carbon\\Carbon::rawCreateFromFormat('Y-m-d','2020-08-12T23:0...',NULL)

如您所见,它要删除一天并尝试在前一天晚上11点格式化吗?

在Laravel为日期添加0000-00-00之前,我遇到了类似的问题,因此我不得不在访问器中将其删除,但是现在它在晚上11点抛出,我的字符串替换不再起作用。显然,我可以只更改字符串替换器以查找晚上11点,但是我不想每次格式更改时都必须解决此问题。

我的访问者代码如下

    public function getDateAttribute($value){
        //String replace and remove the time from the value if it exists
        $value = str_replace(' 00:00:00','',$value);
        return Carbon::CreateFromFormat('Y-m-d',$value)->format('d/m/Y');
    }

以前有没有人遇到过这样的错误,或者知道发生了什么事?

解决方法

Laravel 7 之前,日期将被序列化为以下格式:

2019-12-02 20:01:00

但是,在雄辩的语言上使用 toArray toJson 方法时, Laravel 7 使用新的日期序列化格式。型号,日期格式为 ISO-8601 ISO-8601 日期始终以 UTC 表示,如下所示:

2019-12-02T20:01:00.283041Z

如果您想继续使用以前的行为,可以在模型上覆盖 serializeDate()方法,请将其添加到模型中:

use DateTimeInterface;

protected function serializeDate(DateTimeInterface $date)
{
    return $date->format('Y-m-d H:i:s');
}
,

首先在模型上将您的列定义为$ dates属性:

$dates=['date']

然后按访问者指定日期格式:

   public function getDateAttribute($value){
      
        return $val->format('d/m/Y');
    }
,
public function getDateAttribute($value){
   // return  2020-08-17
     $date = date('Y-m-d',strtotime($value));
    return $date;
}

确保配置文件。您会发现本地时间功能可以将其值从UTC更改为您所在国家的当地时间

config / app.php

'timezone' => 'Asia/Riyadh',
,

正在删除一天并尝试在前一天晚上11点格式化

这显然是时区偏移(您可能在GMT + 1中),并且这是向GMT + 0(UTC)的偏移。

您不应该缩短强制执行“ 00:00:00”的时间,因为这只会在1个时区起作用(没有全球性的午夜时刻,每天每个时区的午夜时刻都不同),而您的应用现在或以后可能会处理多个时区。您应该将时区(例如“欧洲/伦敦”)保存在另一个数据库列中,这样您就可以保留完整的信息,并且在检索日期时,可以即时计算该日期(之前)的午夜-时间取决于用户的时区。

相关问答

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