将字符串转换为碳

2022-08-30 08:51:44

我使用的是 Laravel 5.1

几天前,我在模型中使用字符串日期转换为 Carbon 实例。在 HTML 中,日期的创建表单中的默认值为protected $dates = ['license_expire']Carbon\Carbon::now()->format('Y-m-d')

为了在主页中显示警报,我使用了<p>Licence Expired: <b>{{ $employee->license_expire < Carbon\Carbon::now()?'License has expired':$employee->license_expire->diffForHumans() }}</b></p>

在此之前,diffForHumans() 方法工作正常。

但是在这种情况下,编辑表单的默认值也是今天的日期,无论数据库中有什么(我使用的是部分表单)。为了解决这个问题,我将HTML中的默认值更改为NUll。并在我的模型中添加另一种方法,以创建形式显示当前日期。

public function getLicenseExpireAttribute($date)
{
    return Carbon::parse($date)->format('Y-m-d');
}

之后,当我去主页时,我有一个说FatalErrorExceptionCall to a member function diffForHumans() on string

当我检查日期时,它再次成为STRING。dd($employee->license_expire)

任何人都可以告诉我在这种情况下如何将字符串转换为Carbon?

使我的创建表单的默认日期作为今天的日期,编辑表单从数据库的日期,我可以使用diffForHumans()在主页中显示警报?


答案 1

你快到了。

删除protected $dates = ['license_expire']

,然后将您的访问器更改为:LicenseExpire

public function getLicenseExpireAttribute($date)
{
    return Carbon::parse($date);
}

这样,无论如何它都会返回一个实例。因此,对于您的表单,您只需要(或任何所需的格式),并且也应该在您的主页上工作。Carbon$employee->license_expire->format('Y-m-d')diffForHumans()


如果您使用的是 Laravel 9+,则可以使用更新的语法来定义访问器

use Illuminate\Database\Eloquent\Casts\Attribute;

public function licenseExpire(): Attribute 
{
    return Attribute::make(
        get: fn ($value) => Carbon::parse($value);
    );
}

答案 2

为什么不尝试使用以下方法:

$dateTimeString = $aDateString." ".$aTimeString;
$dueDateTime = Carbon::createFromFormat('Y-m-d H:i:s', $dateTimeString, 'Europe/London');   

推荐