【问题标题】:Set the default __toString() format per Carbon instance?为每个 Carbon 实例设置默认的 __toString() 格式?
【发布时间】:2021-07-23 17:26:16
【问题描述】:

我从数据库中检索日期并可以选择对它们进行预处理(通过 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
}

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

【问题讨论】:

    标签: php-carbon


    【解决方案1】:

    我遇到了同样的问题,并解决了它

    首先为碳日期创建一个全局序列化方法(例如在 Laravel AppServiceProvider 的启动中)

    <?php
    
    namespace App\Providers;
    
    use Illuminate\Support\Carbon;
    use Illuminate\Support\ServiceProvider;
    
    class AppServiceProvider extends ServiceProvider {
    
        /**
        * Bootstrap any application services.
        *
        * @return void
        */
        public function boot() {
    
            // ...
    
            Carbon::serializeUsing(function (Carbon $carbon):string {
                    $format = $carbon->getSettings()['toStringFormat'] ?? 'Y-m-d\TH:i:s';
                    return $carbon->format($format);
                });
    
            // ...
        }
    
        // ...
    
    }
    

    然后将“toStringFormat”设置为您需要的格式

    $someCarbonDate->settings([ 'toStringFormat' => 'Y-m-d' ]);
    

    Carbon::serializeUsing 现在将检查被序列化的碳是否具有 toStringFormat 并使用它,否则它将回退到您定义的其他格式。

    您可能还可以创建自己的 Carbon 类并扩展 Carbon\Carbon 或 Illuminate\Support\Carbon(由 Laravel 使用)并覆盖 __toString 方法,但是当与 Laravel 内部的强制转换结合使用时会产生一些新的挑战.

    【讨论】:

    【解决方案2】:

    如果您只想在渲染 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-&gt;created_at }} 现在默认呈现为23/07/2021 10:16:24

    {{ $user-&gt;created_at-&gt;toDateString() }} 仍然有效,并将呈现为 23/07/2021

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

    【讨论】:

      猜你喜欢
      • 2018-03-27
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 2013-10-28
      • 2017-12-02
      • 2019-03-28
      相关资源
      最近更新 更多