文章转自:learnku.com/php/t/26998php
在 PHP 中使用日期和时间并非容易或清晰的任务。咱们必须处理 strtotime
,格式化问题,大量计算等等。laravel
这个漂亮的包叫作 Carbon 能够帮助在 PHP 开发中处理日期/时间变得更加简单、更语义化,从而使得咱们的代码更容易阅读和维护。git
Carbon 是由 Brian Nesbit 开发的一个包,它扩展了 PHP 本身的 DateTime 类。github
它提供了一些很好的功能来处理 PHP 中的日期,特别是诸如:api
全部的这些都带来了一个很是有用的包,使得这些在 PHP 中处理时间很是容易。bash
为了使用 Carbon ,你须要从 Carbon
命名空间中导入 Carbon 。幸运的是,在 Laravel 中已经包括了 Carbon ,因此不须要和 Composer 一块儿添加。网络
当咱们须要使用 Carbon 的时候,咱们能够这样导入它:composer
<?php
use Carbon\Carbon;
复制代码
在导入以后,让咱们看看咱们能够用这个很棒的包作一些很酷的事情。ui
// 获取当前时间 - 2015-12-19 10:10:54
$current = Carbon::now();
$current = new Carbon();
// 获取今天 - 2015-12-19 00:00:00
$today = Carbon::today();
// 获取昨天 - 2015-12-18 00:00:00
$yesterday = Carbon::yesterday();
// 获取明天 - 2015-12-20 00:00:00
$tomorrow = Carbon::tomorrow();
// 解析特定字符串 - 2016-01-01 00:00:00
$newYear = new Carbon('first day of January 2016');
// 设定一个特定的时区 - 2016-01-01 00:00:00
$newYearPST = new Carbon('first day of January 2016', 'America\Pacific');
复制代码
除了快速定义日期/时间方法以外,Carbon 也可让咱们从特定数量的参数中建立时间。spa
Carbon::createFromDate($year, $month, $day, $tz);
Carbon::createFromTime($hour, $minute, $second, $tz);
Carbon::create($year, $month, $day, $hour, $minute, $second, $tz);
复制代码
当你以一种一般不被 Carbon 识别的格式得到某种日期或时间时,这些是很是有用的。若是你为任何一个参数传递 null
值,则它默认会使用当前日期/时间传递 。
抓取日期/时间并非你在处理日期时惟一要作的事情。你常常须要操做日期或时间。
例如,当为一个用户建立一个试用期时,你将但愿试用期在必定时间后过时。假设咱们有 30 天的试用期。咱们能够用 add
和 subtract
很容易的计算出时间。
在这段试用期内,咱们会:
// 获取当前时间
$current = Carbon::now();
// 添加 30 天到当前时间
$trialExpires = $current->addDays(30);
复制代码
从 Carbon 文档 中,咱们能够找到一些其余的 add()
和 sub()
方法:
$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
echo $dt->addMonths(60); // 2017-01-31 00:00:00
echo $dt->addMonth(); // 2017-03-03 00:00:00 equivalent of $dt->month($dt->month + 1); so it wraps
echo $dt->subMonth(); // 2017-02-03 00:00:00
echo $dt->subMonths(60); // 2012-02-03 00:00:00
echo $dt->addDays(29); // 2012-03-03 00:00:00
echo $dt->addDay(); // 2012-03-04 00:00:00
echo $dt->subDay(); // 2012-03-03 00:00:00
echo $dt->subDays(29); // 2012-02-03 00:00:00
echo $dt->addWeekdays(4); // 2012-02-09 00:00:00
echo $dt->addWeekday(); // 2012-02-10 00:00:00
echo $dt->subWeekday(); // 2012-02-09 00:00:00
echo $dt->subWeekdays(4); // 2012-02-03 00:00:00
echo $dt->addWeeks(3); // 2012-02-24 00:00:00
echo $dt->addWeek(); // 2012-03-02 00:00:00
echo $dt->subWeek(); // 2012-02-24 00:00:00
echo $dt->subWeeks(3); // 2012-02-03 00:00:00
echo $dt->addHours(24); // 2012-02-04 00:00:00
echo $dt->addHour(); // 2012-02-04 01:00:00
echo $dt->subHour(); // 2012-02-04 00:00:00
echo $dt->subHours(24); // 2012-02-03 00:00:00
echo $dt->addMinutes(61); // 2012-02-03 01:01:00
echo $dt->addMinute(); // 2012-02-03 01:02:00
echo $dt->subMinute(); // 2012-02-03 01:01:00
echo $dt->subMinutes(61); // 2012-02-03 00:00:00
echo $dt->addSeconds(61); // 2012-02-03 00:01:01
echo $dt->addSecond(); // 2012-02-03 00:01:02
echo $dt->subSecond(); // 2012-02-03 00:01:01
echo $dt->subSeconds(61); // 2012-02-03 00:00:00
复制代码
另一种快速操做或读取时间的方法是使用可用的 getters 和 serrers 。
$dt = Carbon::now();
// 设置一些参数
$dt->year = 2015;
$dt->month = 04;
$dt->day = 21;
$dt->hour = 22;
$dt->minute = 32;
$dt->second = 5;
// 获取一些参数
var_dump($dt->year);
var_dump($dt->month);
var_dump($dt->day);
var_dump($dt->hour);
var_dump($dt->second);
var_dump($dt->dayOfWeek);
var_dump($dt->dayOfYear);
var_dump($dt->weekOfMonth);
var_dump($dt->daysInMonth);
复制代码
咱们甚至还能够把一些 setter 串在一块儿。
$dt = Carbon::now();
$dt->year(1975)->month(5)->day(21)->hour(22)->minute(32)->second(5)->toDateTimeString();
$dt->setDate(1975, 5, 21)->setTime(22, 32, 5)->toDateTimeString();
$dt->setDateTime(1975, 5, 21, 22, 32, 5)->toDateTimeString();
复制代码
在上面的示例中,你可能注意到了 ->toDateTimeString()
方法。咱们能够方便的为达到咱们的目的去进行格式化。在这种状况下,咱们获得了一个日期时间字符串。
$dt = Carbon::now();
echo $dt->toDateString(); // 2015-12-19
echo $dt->toFormattedDateString(); // Dec 19, 2015
echo $dt->toTimeString(); // 10:10:16
echo $dt->toDateTimeString(); // 2015-12-19 10:10:16
echo $dt->toDayDateTimeString(); // Sat, Dec 19, 2015 10:10 AM
// ……固然 format() 也能够这样用
echo $dt->format('l jS \\of F Y h:i:s A'); // Saturday 19th of December 2015 10:10:16 AM
复制代码
经过 diff()
方法能够很容易的显示相对时间。
例如,咱们有一篇博客,而且咱们想显示它是在 三小时 前发布的。能够利用这些方法。
这些方法用于求两个时间的时间差。
$current = Carbon::now();
$dt = Carbon::now();
$dt = $dt->subHours(6);
echo $dt->diffInHours($current); // -6
echo $current->diffInHours($dt); // 6
$future = $current->addMonth();
$past = $current->subMonths(2);
echo $current->diffInDays($future); // 31
echo $current->diffInDays($past); // -62
复制代码
在过去的几年,显示相对时间变得愈来愈流行。在 Twitter 和 Facebook 等社交网络中常常能够看到。
例如,将时间显示为 3 小时前 比显示 上午 8:12,更适合人类阅读。
这些方法被用于计算时间差,并转换为人类可阅读的格式。
这里有四种表达时间差的方式:
$dt = Carbon::now();
$past = $dt->subMonth();
$future = $dt->addMonth();
echo $dt->subDays(10)->diffForHumans(); // 10 天前
echo $dt->diffForHumans($past); // 1 个月前
echo $dt->diffForHumans($future); // 1 个月前
复制代码
Carbon 能作的远远不止这些。请务必查看 Carbon 官方文档。但愿这能帮助你在 PHP 中更容易的使用日期 / 时间并加快开发效率!