Carbon - 赋予yii2强大的时间操作能力 [ 技术分享 ]
能将一个时间库做到在github上8000+星星、各大PHP框架内置采用,无不体现Carbon过人之处。
阿北将尽量使用最通俗的语言带你入门,本教程使用carbon版本为1.25.0,运行环境如下:
- PHP7.1.8(carbon最低版本要求为5.3)
- Yii2.0.14(作为carbon演示程序,非必须)
- Nginx
安装它
Carbon支持人工安装和composer安装。
composer安装
这个最简单,使用下面代码即可完成。
composer require nesbot/carbon
这个扩展会有两个扩展包被下载下来,vendor目录中可以找到它们。
人工安装
我并不推荐这样做,如果非要不可,请如下步骤
1、下载Carbon.php文件 到你程序的任何位置。
https://github.com/briannesbitt/Carbon/blob/master/src/Carbon/Carbon.php
2、开始使用 引入我们刚刚下载的Carbon.php文件。
require 'path/to/Carbon.php';
use Carbon\Carbon;
echo Carbon::now();
开始使用
Carbon在我们操作时间时更加语义化,它提供了一些对象方法和一些静态方法,为了讲解方便,我们采用问答式。
获得当前时间
在php里我们可以通过date方法构造,并输入我们想要的格式,而在Carbon则如下
Carbon::now();//2018-03-27 21:52:45
Carbon::now('Europe/London');//你也可以指定时区
当然你也可以轻松获取时区
Carbon::now()->tzName;// Asia/Shanghai
既然有now(),自然Carbon还很贴心的支持以下静态方法
Carbon::today();// 2018-03-27 00:00:00
Carbon::tomorrow();//2018-03-28 00:00:00
Carbon:: yesterday();//2018-03-26 00:00:00
和now()一样,你可以为其传入时区参数。
某个时间点
我们还可以为上面的now()这样的方法添加细节,比如我想获得昨天早上8点的时间值。
Carbon::yesterday()->addHours(8);//2018-03-26 08:00:00
Carbon::yesterday()->addHours(8)->addMinutes(29);//2018-03-26 08:29:00
Carbon::yesterday()->addHours(8)->addMinutes(29)->addSeconds(19);//2018-03-26 08:29:19
作为一名phper,我们总喜欢将时间转化为时间戳后存入数据库,用Carbon很简单
Carbon::yesterday()->addHours(8)->timestamp;
轻松拿到时间戳。
此刻是未来还是过去?
在这个世界上有很多日子是值得记住的,比如生日、比如周六、比如未来等等,考虑到这样的需求,Carbon规划了如下方法。
- isWeekday
- isWeekend
- isYesterday
- isToday
- isTomorrow
- isNextWeek
- isLastWeek
- isNextMonth
- isLastMonth
- isNextYear
- isLastYear
- isFuture
- isPast
- isLeapYear
- isLongYear
- isSameAs
- isCurrentYear
- isSameYear
- isCurrentMonth
- isSameMonth
- isSameDay
- isDayOfWeek
- isSunday
- isMonday
- isTuesday
- isWednesday
- isThursday
- isFriday
- isSaturday
大多数可以看懂,有些特殊的说明下
- isFuture 将来
- isPast 过去
- isLeapYear 闰年
海纳百川
我们刚刚是通过一些时刻生成了Carbon对象,比如now、today等,除了这些Carbon还可以包容其他来源,比如下面的
Carbon::createFromDate($year, $month, $day, $tz);
Carbon::createFromTime($hour, $minute, $second, $tz);
Carbon::createFromTimeString("$hour:$minute:$second", $tz);
Carbon::create($year, $month, $day, $hour, $minute, $second, $tz);
$tz代表时区。
还有一个我们老喜欢的 从时间戳获得时间。
Carbon::createFromTimestamp(time())->addHours(-1);//获得一个小时前的时间点
注意,针对于addHours等方法,你可以填写复数代表之前,是不是和我们脑子里想的一样一样的。
解析时间
上面都是通过其他形式获得时间,还有一种就是通过解析传递的时间来获取Carbon对象然后进一步操作,比如
Carbon::parse("2018-03-27")->addHours(-1);// 2018-03-26 23:00:00
还支持一些语言内容first day of January 2008
Carbon::parse("first day of January 2008")->addHours(-1);
是不是很聪明。
3秒前
还有种经常用的时间格式就是5小时前、4秒前这种,当然在yii2中有 Yii::$app->formatter->asRelativeTime() 可以达到这个目的,使用Carbon那?
Carbon::now()->diffForHumans();// 1 second ago
呀,怎么还是英文那?别怕,我们支持当地语言包,如下。
Carbon::setLocale('zh');
Carbon::now()->diffForHumans();// 1秒前
迄今为止,Carbon一共支持64种语言。
针对于diffForHumans还支持一些参数配置,我们会在Carbon速查表中给出。
格式化
针对于一个时间,Carbon允许我们不同的格式化、不同的输出,比如下面的代码
$dt = Carbon::create(1975, 12, 25, 14, 15, 16);
echo $dt->toDateString(); // 1975-12-25
echo $dt->toFormattedDateString(); // Dec 25, 1975
echo $dt->toTimeString(); // 14:15:16
echo $dt->toDateTimeString(); // 1975-12-25 14:15:16
echo $dt->toDayDateTimeString(); // Thu, Dec 25, 1975 2:15 PM
并且Carbon还提供了一个通用方法
$dt->format("Y-m-d H:i:s")
判断是否符合(重点)
有时候我们需要判断用户输入的值是否是我们要的时间格式,可以用Carbon提供的hasFormat方法。
$dt->hasFormat('2018-03-03', 'Y-m-d');//false
返回真假。
区间判断
有时候我们需要判断用户输入的时间是否在指定的时间范围内,用Carbon轻松完成。
Carbon::parse($date)->between($first, $second);// true / false
这里要注意$first和$second也是Carbon对象。
小结
以上就是Carbon一些常用方法,当然还有很多不常用的,具体大家可以去源文件Carbon.php中看看,这个库的目录结构很简单,就是方法繁多。
另外这段时间我会抽空整理出Carbon的速查表,发布后你可以一键速查。
相关链接
阿北的知识分享 https://nai8.me
共 3 条回复
abei1982 河南洛阳
最后登录:2020-04-14
在线时长:128小时48分
- 粉丝307
- 金钱4935
- 威望50
- 积分6715