083. 日期及时间处理——nesbot/carbon

日期及时间处理------nesbot/carbon

Carbon 是一个处理日期和时间的扩展包,相信你应该很熟悉这个扩展包了,因为 Laravel 默认已经依赖了它,通过 composer  why 命令可以查看依赖关系。

$ composer why nesbot/carbon

file

Laravel 依赖了 Carbon 1.26 或者 2.0 版本,所以不需要单独安装,我这里的环境是 Laravel 5.8,所以安装的是 Carbon 2.0。

$ composer info nesbot/carbon

file

https://github.com/briannesbitt/carbon/blo... 查看一下源码你会发现它其实是 PHP  DateTime 类的扩展,

使用

Carbon 的使用很简单,文档中有很详细的方法解释和例子,所以当你需要某些日期处理方法的时候,一定先看看文档 https://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;

file

返回的是个 Carbon 对象,调用 toDateTimeString() 方法可以转换成一个字符串,同样 Carobn 也实现了 __toString 魔术方法,同样可以返回字符串。

如果你想让某个其他的字段也 Carbon 对象,那么设置模型中的 $dates 属性就行了,文档中有详细描述 https://learnku.com/docs/laravel/5.8/eloquent-muta...

时间处理

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'); 

file

时间比较

再有就是对时间的比较了

\Carbon\Carbon::now();
now();
$user->created_at->diffInMinutes(now());
$user->created_at->diffInHours(now());

file

另一个非常有用的方法是,显示时间与当前时间的间隔。

$user->created_at->diffForHumans();

file

报错了,这个报错的级别比较低,只是对一个方法的反对,提示我们 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());
});

file

当然也是支持中文的。

config/app.php

'locale' => 'zh-CN',

file

Carbon 提供了非常多的方法用户时间和日期的处理,需要的时候看看文档,你一定能找到需要的方法。

Carbon 2 变化

最后随着 Laravel 5.8 的发布,依赖的 Carbon 版本升级到了 2.0,其中也带来了一些变动,具体可以看看这里 https://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;

file

你应该能发现区别,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;

file

本文章首发在 LearnKu.com 网站上。
上一篇 下一篇
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 0
发起讨论 只看当前版本


暂无话题~