我从数据库中检索日期,并可以选择对其进行预处理(通过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
}
在视图中,我将在日期上链接方法,或按原样打印。
我遇到了同样的问题,并设法解决了该问题
首先为碳日期创建全局序列化方法(例如,在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在内部进行的铸造结合使用时,这会带来一些新的挑战。