为每个Carbon实例设置默认的__toString()格式?

时间:2016-07-29 11:07:14

标签: php-carbon

我从数据库中检索日期,并可以选择预处理它们(通过Laravel框架(v5.2))。日期或时间可以采用任何特定格式,但对于此示例,请说Y-m-d

我希望能够在视图中访问日期作为Carbon实例 - 这将使我能够灵活地格式化日期但是我喜欢或者不做任何事情并按原样打印(默认的toString是与原始字符串格式相同。)

问题是在顶级Carbon toString格式中维护默认的toString格式。

根据docs,您可以使用::setToStringFormat()方法更改toString的默认格式。可以使用静态方法Carbon::setToStringFormat()进行设置,但它也可以用作实例方法,例如($date = Carbon::now())->setToStringFormat('Y-m-d') - 尽管这似乎与静态方法的行为相同。

那么,是否可以为日期实例设置单独的__toString()格式?

这将允许我执行以下操作:

public function getDateAttribute($value)
{
    $date = Carbon::createFromFormat('Y-m-d', $value);
    // $date->setToStringFormat('Y-m-d');
    return $date; // prints in 'Y-m-d' format
}

在视图中,我会在日期链接方法,或按原样打印。

1 个答案:

答案 0 :(得分:0)

如果您只想设置渲染 Blade 模板时的默认格式,您可以使用 Blade::stringable 方法。

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{

    // ...

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot() {
        // ...

        Blade::stringable(function(\Illuminate\Support\Carbon $dateTime) {
            return $dateTime->format('d/m/Y H:i:s');
        });

        // ...
    }

    // ...
}

除非您另有选择,否则任何 Illuminate\Support\Carbon 实例都应自动以这种格式呈现。

例如...

{{ $user->created_at }} 现在默认呈现为 23/07/2021 10:16:24

{{ $user->created_at->toDateString() }} 仍然有效并且会呈现为 23/07/2021

注意:您可能需要运行 php artisan view:clear 以清除所有已编译的视图,然后才能生效 ?