Laravel中日期时间处理包Carbon的简单使用
前言
我们大家在编写PHP应用时经常需要处理日期和时间,这篇文章带你了解一下Carbon–继承自PHPDateTime类的API扩展,它使得处理日期和时间更加简单。
Laravel中默认使用的时间处理类就是Carbon。
你可以在Carbon命名空间的Carbon类中看到上面声明的代码片段。
安装
可以通过Composer来安装Carbon:
composerrequirenesbot/carbonPS:由于Laravel项目已默认安装了此包,所以不需要再次执行上面的命令。
使用
你需要通过命名空间导入Carbon来使用,而不需每次都提供完整的名称。
useCarbon\Carbon;获取当前时间
可以同now()方法获取当前的日期和时间。如果你不指定参数,它会使用PHP配置中的时区:
如果你想使用一个不同的时区,你需要传递一个有效的时区作为参数:
//直接使用字符串 echoCarbon::now('Europe/London');//2016-10-1420:21:20 //或者 echoCarbon::now(newDateTimeZone('Europe/London'));除now()外,还提供了today()、tomorrow()、yesterday()等静态函数,不过,它们的时间都是00:00:00:
echoCarbon::now();//2016-10-1415:18:34 echoCarbon::today();//2016-10-1400:00:00 echoCarbon::tomorrow('Europe/London');//2016-10-1400:00:00 echoCarbon::yesterday();//2016-10-1400:00:00以上输出结果其实是一个Carbon类型的日期时间对象:
Carbon{#179▼ +"date":"2016-06-1400:00:00.000000" +"timezone_type":3 +"timezone":"UTC" }要想获取字符串类型的日期,可以使用下面的代码:
echoCarbon::today()->toDateTimeString(); echoCarbon::yesterday()->toDateTimeString(); echoCarbon::tomorrow()->toDateTimeString();日期类型转为字符串
如上所述,默认情况下,Carbon的方法返回的为一个日期时间对象。虽然它是一个对象,但是你却可以直接使用echo输出结果,因为有__toString魔术方法。但是如果你想把它转为字符串,可以使用toDateString或toDateTimeString方法:
echoCarbon::now()->toDateString();//2016-10-14 echoCarbon::now()->toDateTimeString();//2016-10-1420:22:50日期解析
你还可以使用parse方法解析任何顺序和类型的日期(结果为Carbon类型的日期时间对象):
echoCarbon::parse('2016-10-15')->toDateTimeString();//2016-10-1500:00:00 echoCarbon::parse('2016-10-15')->toDateTimeString();//2016-10-1500:00:00 echoCarbon::parse('2016-10-1500:10:25')->toDateTimeString();//2016-10-1500:10:25 echoCarbon::parse('today')->toDateTimeString();//2016-10-1500:00:00 echoCarbon::parse('yesterday')->toDateTimeString();//2016-10-1400:00:00 echoCarbon::parse('tomorrow')->toDateTimeString();//2016-10-1600:00:00 echoCarbon::parse('2daysago')->toDateTimeString();//2016-10-1320:49:53 echoCarbon::parse('+3days')->toDateTimeString();//2016-10-1820:49:53 echoCarbon::parse('+2weeks')->toDateTimeString();//2016-10-2920:49:53 echoCarbon::parse('+4months')->toDateTimeString();//2017-02-1520:49:53 echoCarbon::parse('-1year')->toDateTimeString();//2015-10-1520:49:53 echoCarbon::parse('nextwednesday')->toDateTimeString();//2016-10-1900:00:00 echoCarbon::parse('lastfriday')->toDateTimeString();//2016-10-1400:00:00构造日期
你还可以使用单独的年月日来构造日期:
$year='2015'; $month='04'; $day='12'; echoCarbon::createFromDate($year,$month,$day);//2015-04-1220:55:59 $hour='02'; $minute='15': $second='30'; echoCarbon::create($year,$month,$day,$hour,$minute,$second);//2015-04-1202:15:30 echoCarbon::createFromDate(null,12,25);//年默认为当前年份此外,还可以传递一个有效的时区作为最后一个参数。
日期操作
日期操作可以通过add(增加)或sub(减去)跟上要增加或减去的单位来完成。例如,你想给一个日期增加指定的天数,你可以使用addDays方法。此外还提供了一个modify方法,参数格式为+或-跟上值及单位。所以,如果你想给当前日期增加一年,你可以传递+1year:
echoCarbon::now()->addDays(25);//2016-11-0914:00:01 echoCarbon::now()->addWeeks(3);//2016-11-0514:00:01 echoCarbon::now()->addHours(25);//2016-10-1615:00:01 echoCarbon::now()->subHours(2);//2016-10-1512:00:01 echoCarbon::now()->addHours(2)->addMinutes(12);//2016-10-1516:12:01 echoCarbon::now()->modify('+15days');//2016-10-3014:00:01 echoCarbon::now()->modify('-2days');//2016-10-1314:00:01日期比较
在Carbon中你可以使用下面的方法来比较日期:
- min–返回最小日期。
- max–返回最大日期。
- eq–判断两个日期是否相等。
- gt–判断第一个日期是否比第二个日期大。
- lt–判断第一个日期是否比第二个日期小。
- gte–判断第一个日期是否大于等于第二个日期。
- lte–判断第一个日期是否小于等于第二个日期。
echoCarbon::now()->tzName;//America/Toronto $first=Carbon::create(2012,9,5,23,26,11); $second=Carbon::create(2012,9,5,20,26,11,'America/Vancouver'); echo$first->toDateTimeString();//2012-09-0523:26:11 echo$first->tzName;//America/Toronto echo$second->toDateTimeString();//2012-09-0520:26:11 echo$second->tzName;//America/Vancouver var_dump($first->eq($second));//bool(true) var_dump($first->ne($second));//bool(false) var_dump($first->gt($second));//bool(false) var_dump($first->gte($second));//bool(true) var_dump($first->lt($second));//bool(false) var_dump($first->lte($second));//bool(true) $first->setDateTime(2012,1,1,0,0,0); $second->setDateTime(2012,1,1,0,0,0);//Remembertzis'America/Vancouver' var_dump($first->eq($second));//bool(false) var_dump($first->ne($second));//bool(true) var_dump($first->gt($second));//bool(false) var_dump($first->gte($second));//bool(false) var_dump($first->lt($second));//bool(true) var_dump($first->lte($second));//bool(true)
要判断一个日期是否介于两个日期之间,可以使用between()方法,第三个可选参数指定比较是否可以相等,默认为true:
$first=Carbon::create(2012,9,5,1); $second=Carbon::create(2012,9,5,5); var_dump(Carbon::create(2012,9,5,3)->between($first,$second));//bool(true) var_dump(Carbon::create(2012,9,5,5)->between($first,$second));//bool(true) var_dump(Carbon::create(2012,9,5,5)->between($first,$second,false));//bool(false)
此外还提供了一些辅助方法,你可以从它们的名字中明白其含义:
$dt=Carbon::now(); $dt->isWeekday(); $dt->isWeekend(); $dt->isYesterday(); $dt->isToday(); $dt->isTomorrow(); $dt->isFuture(); $dt->isPast(); $dt->isLeapYear(); $dt->isSameDay(Carbon::now()); $born=Carbon::createFromDate(1987,4,23); $noCake=Carbon::createFromDate(2014,9,26); $yesCake=Carbon::createFromDate(2014,4,23); $overTheHill=Carbon::now()->subYears(50); var_dump($born->isBirthday($noCake));//bool(false) var_dump($born->isBirthday($yesCake));//bool(true) var_dump($overTheHill->isBirthday());//bool(true)->defaultcompareittotoday!
diffForHumans
“一个月前”比“30天前”更便于阅读,很多日期库都提供了这个常见的功能,日期被解析后,有下面四种可能性:
1、当比较的时间超过当前默认时间
- 1天前
- 5月前
2、当用将来的时间与当前默认时间比较
- 1小时距现在
- 5月距现在
3、当比较的值超过另一个值
- 1小时前
- 5月前
4、当比较的值在另一个值之后
- 1小时后
- 5月后
你可以把第二个参数设置为true来删除“前”、“距现在”等修饰语:diffForHumans(Carbon$other,true) 。
echoCarbon::now()->subDays(5)->diffForHumans();//5天前 echoCarbon::now()->diffForHumans(Carbon::now()->subYear());//1年后 $dt=Carbon::createFromDate(2011,8,1); echo$dt->diffForHumans($dt->copy()->addMonth());//1月前 echo$dt->diffForHumans($dt->copy()->subMonth());//11月后 echoCarbon::now()->addSeconds(5)->diffForHumans();//5秒距现在 echoCarbon::now()->subDays(24)->diffForHumans();//3周前 echoCarbon::now()->subDays(24)->diffForHumans(null,true);//3周
本地化
可以在app/Providers/AppServiceProvider.php的boot()方法中添加下面的代码来设置全局本地化:
publicfunctionboot() { \Carbon\Carbon::setLocale('zh'); }
设置好之后,在输出时间的地方调用:
$article->created_at->diffForHumans();
类似的格式即可。
更多Carbon操作,可查看文档。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。