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

问题描述 投票:2回答:1

我从数据库中检索日期,并可以选择对其进行预处理(通过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个回答
0
投票

我遇到了同样的问题,并设法解决了该问题

首先为碳日期创建全局序列化方法(例如,在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在内部进行的铸造结合使用时,这会带来一些新的挑战。

© www.soinside.com 2019 - 2024. All rights reserved.