将字符串转换为Carbon

76

我正在使用Laravel 5.1

几天前,我在我的模型中使用了protected $dates = ['license_expire']来将字符串日期转换为Carbon实例。在HTML中,创建表单中日期的默认值是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中的默认值为空。并在我的模型中添加了另一个方法,在创建表单中显示当前日期。

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

之后当我回到主页时,出现了一个FatalErrorException,其中显示了Call to a member function diffForHumans() on string

当我使用dd($employee->license_expire)检查日期时,它又变成了字符串。

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

或者

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

4个回答

125

你差不多到达目标了。

移除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);
    );
}

3
是的!它非常有帮助。我按照你说的做了,现在完全符合我的预期,运行得非常完美。 - smartrahat

21

为什么不试着使用以下内容:

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

0

$filter['dateOfService']='06.2021';

$d1 = Carbon::createFromFormat('m.Y', $filter['dateOfService'], 'Europe/Warsaw')->format('m.Y');

-4

试一下这个

$date = Carbon::parse(date_format($youttimestring,'d/m/Y H:i:s'));
echo $date;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接