Php Laravel自动将时间添加到日期
我的Laravel应用程序似乎有问题,我一辈子都搞不清楚到底发生了什么 我的MySQL数据库中有一个简单的日期字段,它的数据类型只是Php Laravel自动将时间添加到日期,php,mysql,laravel,php-carbon,Php,Mysql,Laravel,Php Carbon,我的Laravel应用程序似乎有问题,我一辈子都搞不清楚到底发生了什么 我的MySQL数据库中有一个简单的日期字段,它的数据类型只是date,在本例中,值是2020-08-13,但由于某种原因,当我尝试访问日期时,它会在末尾添加一个时间戳,减去1天并抛出一个数据错误 它肯定是这个日期,因为当我软删除它,错误消失 例如,此日期的错误为 Carbon\\Carbon::rawCreateFromFormat('Y-m-d','2020-08-12T23:0…',NULL) 如你所见,它取消了一天,并
date
,在本例中,值是2020-08-13
,但由于某种原因,当我尝试访问日期时,它会在末尾添加一个时间戳,减去1天并抛出一个数据错误
它肯定是这个日期,因为当我软删除它,错误消失
例如,此日期的错误为
Carbon\\Carbon::rawCreateFromFormat('Y-m-d','2020-08-12T23:0…',NULL)
如你所见,它取消了一天,并试图在前一天晚上11点格式化
我以前也遇到过类似的问题,Laravel在日期中添加了0000-00-00
,因此我不得不在访问器中删除它,但现在它将在晚上11点抛出,我的字符串替换不再起作用。很明显,我可以将字符串替换程序更改为查找11pm,但我不希望每次格式更改时都要修复这个问题
我的访问器代码如下
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
但是,Laravel 7在雄辩的模型上使用toArray或toJson方法时,使用了新的日期序列化格式,日期格式为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=['date']
首先在模型上定义列到$dates属性:
use DateTimeInterface;
protected function serializeDate(DateTimeInterface $date)
{
return $date->format('Y-m-d H:i:s');
}
$dates=['date']
然后按访问者指定日期格式:
public function getDateAttribute($value){
return $val->format('d/m/Y');
}
确保配置文件。您会发现当地时间函数可以将其值从UTC更改为您所在国家的当地时间
config/app.php
'timezone' => 'Asia/Riyadh',
它删除了一天,并试图在前一天晚上11点格式化
这显然是一个时区转换(你可能在GMT+1),这是一个GMT+0(UTC)转换
你不应该调整时间来强制“00:00:00”,因为这只适用于一个时区(没有全球午夜时刻,每天每个时区都有不同的午夜时刻),而你的应用程序现在或以后可能处理多个时区。您应该将时区(例如“欧洲/伦敦”)保存在另一个DB列中,这样您就可以保留完整的信息,并且在检索日期时,您可以根据用户时区实时计算从该日期时间(之前)到午夜的时间。您能说出数据字段的名称吗?尝试使用
Carbon::parse($value)->格式(‘d/m/Y’)
你什么意思对不起?@xNoJustice运行正常,不再抛出错误,但我仍然收到一个错误,日期返回错误。现在解析正确,但我得到的是12/08/2020
当我的数据库中的日期是13/08/2020
希望这有助于我在升级时注意到这一点,但我的问题并不严重但是序列化是错误的,它获取的日期比数据库中的日期早了1小时。谢谢您的输入!@S\R我不确定,但可能是它的forISO-8601
格式,该格式将日期指定为UTC
。可能这与您的1小时有关。如果问题尚未解决,请进行数据库查询,而不是模型查询。希望您能获得预期的数据。“2019-12-02T20:01:00.283041Z”实际上是一种更完整的格式。它提供精确的毫秒和时区。如果您将此字符串传递给其他API,如new Date()
在JS中,它会自动将其重新转换为当前时区。避免使用H:i:s,因为没有时区,实际上无法知道该日期时间应考虑在哪个时区。