在 PHP 中处理时间是麻烦的,特别是涉及到时间格式转化,时区转换,时间对比等功能时,本站之前的文章根据文章的新鲜度调整时间的显示方式中,就涉及到了时间处理。有兴趣的朋友可以去看一下实现的代码。为了让日期时间处理变得简单一点,Carbon 日期时间处理库出现了,从此,我们便可以很方便的在 PHP 中处理时间了。
Carbon 简洁的代码和人性化的语法
下面是一段实现月度会员订阅或者续期的代码,第一行中的 Carbon::now( 'Asia/Shanghai' ) 初始化了一个时间为现在的 Carbon 对象,$day->addMonth() 的作用是在现在的时间上,加上一个月,对 PHP 比较熟悉的朋友可以想象一下,如果直接用 PHP 原生函数来实现这个功能的代码是什么样子的。
复制
$day_now = Carbon::now( 'Asia/Shanghai' );
$day = $day_now;
// 如果是老会员,获取过期时间以便升级
if ( $old_expiration_day ) {
$day = Carbon::createFromFormat( 'Y-m-d H:i:s', $old_expiration_day );
}
$new_expiration_day = $day->addMonth()->toDateTimeString();
update_user_meta( $user_id, 'expiration_day', $new_expiration_day );
$user = new WP_User( $user_id );
$user->set_role( 'monthly' );
日期时间的加和减
初始化一个 Carbon 对象化,我们可以直接在这个对象的基础上,增加或减少一天、一周、一月、一年等,不用再去计算一年有多少分多少秒。
复制
$dt = Carbon::create(2012, 1, 31, 0);
echo $dt->toDateTimeString(); // 2012-01-31 00:00:00
echo $dt->addYears(5); // 2017-01-31 00:00:00
echo $dt->addYear(); // 2018-01-31 00:00:00
echo $dt->subYear(); // 2017-01-31 00:00:00
echo $dt->subYears(5); // 2012-01-31 00:00:00
...
显示人性化的日期时间
下面的代码通过添加或减少时间,显示人性化的时间,比如不是显示 2017年4月8日,而是显示一月后,用户看起来,不用思考就知道显示的日期是什么时候的。
复制
echo Carbon::now()->subDays(5)->diffForHumans(); // 5 天前
echo Carbon::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()); // 1 月后
echo Carbon::now()->addSeconds(5)->diffForHumans(); // 5 秒后
echo Carbon::now()->subDays(24)->diffForHumans(); // 3 周前
echo Carbon::now()->subDays(24)->diffForHumans(null, true); // 3 周
日期时间的对比
需要判断某个时间处于现在、过去、还是未来?Carbon 也直接提供了方便的方法。
复制
$dt = Carbon::now();
$dt->isWeekday();
$dt->isWeekend();
$dt->isYesterday();
$dt->isToday();
$dt->isTomorrow();
$dt->isFuture();
$dt->isPast();
$dt->isLeapYear();
Carbon 可以方便准确的帮助我们处理日期时间,减少代码量的同事,也提高了效率。最流行的 PHP 框架 Laravel 中就是用了 Carbon 库来处理日期时间,本文只介绍了部分 Carbon 的使用方法,更多使用方法请参考PHP Carbon 日期时间处理库官方文档。