gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:58:10 26 4
gpt4 key购买 nike

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

我希望能够在 View 中以 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
}

在一个 View 中,然后我会在日期上链接方法,或者按原样打印它。

最佳答案

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

首先为碳日期创建一个全局序列化方法(例如在 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 现在将检查被序列化的 carbon 是否具有 toStringFormat 并使用它,否则它将回退到您定义的其他格式。

您也可以创建自己的 Carbon 类并扩展 Carbon\Carbon 或 Illuminate\Support\Carbon(由 Laravel 使用)并覆盖 __toString 方法,但是当与 Laravel 内部进行的转换结合使用时,这会带来一些新的挑战。

关于php-carbon - 为每个 Carbon 实例设置默认的 __toString() 格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38657293/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com