问题描述
我的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个时区起作用(没有全球性的午夜时刻,每天每个时区的午夜时刻都不同),而您的应用现在或以后可能会处理多个时区。您应该将时区(例如“欧洲/伦敦”)保存在另一个数据库列中,这样您就可以保留完整的信息,并且在检索日期时,可以即时计算该日期(之前)的午夜-时间取决于用户的时区。