083. 日期及时间处理——nesbot/carbon
日期及时间处理------nesbot/carbon
Carbon 是一个处理日期和时间的扩展包,相信你应该很熟悉这个扩展包了,因为 Laravel 默认已经依赖了它,通过 composer why
命令可以查看依赖关系。
$ composer why nesbot/carbon
Laravel 依赖了 Carbon 1.26 或者 2.0 版本,所以不需要单独安装,我这里的环境是 Laravel 5.8,所以安装的是 Carbon 2.0。
$ composer info nesbot/carbon
github.com/briannesbitt/carbon/blo... 查看一下源码你会发现它其实是 PHP DateTime 类的扩展,
使用
Carbon 的使用很简单,文档中有很详细的方法解释和例子,所以当你需要某些日期处理方法的时候,一定先看看文档 carbon.nesbot.com/docs/ 。
我们先尝试几个比较常用的例子。
结合 Model 使用
默认情况下模型的 created_at 和 update_at 返回的就是 Carbon 对象,可以打开 tinker 测试一下
$user = User::first();
$user->created_at;
$user->created_at->toDateTimeString();
(string) $user->created_at;
返回的是个 Carbon 对象,调用 toDateTimeString() 方法可以转换成一个字符串,同样 Carobn 也实现了 __toString
魔术方法,同样可以返回字符串。
如果你想让某个其他的字段也 Carbon 对象,那么设置模型中的 $dates
属性就行了,文档中有详细描述 learnku.com/docs/laravel/5.8/eloqu... 。
时间处理
Carbon 提供了非常多的方法供我们获取各种时间数据或者进行时间的处理。
$user->created_at->year;
$user->created_at->day;
$user->created_at->startOfWeek();
$user->created_at->endOfDay();
$user->created_at->addMinutes(60);
$user->created_at->format('H:i');
时间比较
再有就是对时间的比较了
\Carbon\Carbon::now();
now();
$user->created_at->diffInMinutes(now());
$user->created_at->diffInHours(now());
另一个非常有用的方法是,显示时间与当前时间的间隔。
$user->created_at->diffForHumans();
报错了,这个报错的级别比较低,只是对一个方法的反对,提示我们 transChoice
等方法被反对,应该使用其他的方法代替。这个主要是因为 Symfony/Translation
这个扩展包 4.2 版本的问题。在下面两个 issue 中可以找到 Carbon 作者的讨论。
如果你在其他框架中使用,有两种解决办法,要么降级 Symfony/Translation
至 4.1,要么修改一下报错级别,忽略这个报错,使用 。error_reporting(E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED);
。
在 Laravel 中不用担心这个问题,只是因为这是在 tinker 中测试,所以会看到这个报错,正常情况下这个错误并不会被显示出来,。
routes/web.php
.
.
.
Route::get('carbon', function() {
$user = App\User::first();
dd($user->created_at->diffForHumans());
});
当然也是支持中文的。
config/app.php
'locale' => 'zh-CN',
Carbon 提供了非常多的方法用户时间和日期的处理,需要的时候看看文档,你一定能找到需要的方法。
Carbon 2 变化
最后随着 Laravel 5.8 的发布,依赖的 Carbon 版本升级到了 2.0,其中也带来了一些变动,具体可以看看这里 carbon.nesbot.com/docs/#api-carbon... 。基本上是一些方法的变更,可能大部分情况下我们不会遇到这样的冲突,你大概了解一下即可,下面这个是个比较重要的变动 CarbonImmutable
。
CarbonImmutable
第一个变动是 Carbon 2.0 提供了一个类叫 CarbonImmutable,意思是不变的。我们通过一个例子来说明
$now = Carbon\Carbon::now();
$now->addDay();
$now;
$now = Carbon\CarbonImmutable::now();
$now->addDay();
$now;
你应该能发现区别,CarbonImmutable
并不会改变原来的变量,这个行为在之前的版本中需要通过 copy 方法实现。
$now = Carbon\Carbon::now();
$now->copy()->addDay();
$now;
另外 Laravel 5.8 提供了一个 Date Facade,我们可以手动 use 或者写入 config 中。
config/app.php
'aliases' => [
.
.
.
'Date' => Illuminate\Support\Facades\Date::class,
Date 其实使用的就是 Carbon,所以我们以后直接使用 Date 就可以了,更加的方便。如果我们还希望全局都使用 CarbonImmutable,可以再修改一下代码。
app/Providers/AppServiceProvider.php
.
.
.
use Carbon\CarbonImmutable;
use Illuminate\Support\DateFactory;
.
.
.
public function register()
{
DateFactory::use(CarbonImmutable::class);
}
这样 Date 门面默认使用的就是 CarbonImmutable 了。
$now = Date::now();
$now->addDay();
$now;