在编写 PHP 应用时经常需要处理日期和时间,这篇文章带你了解一下 Carbon – 继承自 PHP DateTime 类的 API 扩展,它使得处理日期和时间更加简单。
1. 通过composer安装
版本环境要求:
1.x is compatible with PHP 5.3+.
2.x version requires PHP 7.1.8+.
composer require nesbot/carbon
{
"require": {
"nesbot/carbon": "^2.16"
}
}
2.使用
<?php
require 'vendor/autoload.php';
use Carbon\Carbon;
printf("Now: %s", Carbon::now());
2.1获取当前时间
echo Carbon::now();
echo Carbon::today();
echo Carbon::tomorrow();
echo Carbon::yesterday();
//today()、tomorrow()、yesterday()等静态函数,它们的时间都是 00:00:00
输出结果
Carbon @1556674336 {#343 ▼
date: 2019-05-01 09:32:16.169639 Asia/Hong_Kong (+08:00)
}
2.2 日期类型转为字符串
如上所述,默认情况下,Carbon 的方法返回的为一个日期时间对象。虽然它是一个对象,但是你却可以直接使用 echo 输出结果,因为有 __toString
魔术方法。但是如果你想把它转为字符串,可以使用 toDateString
或 toDateTimeString
方法:
echo Carbon::now()->toDateString(); //2019-05-01
echo Carbon::now()->toDateTimeString(); //2019-05-01 09:32:16
2.3日期解析
你还可以使用 parse方法解析任何顺序和类型的日期
Carbon::parse($time, $tz)
第一个参数指转换的时间,第二个参数为时区
$time可选的相对修饰符的单词列表是:
+
-
ago
first
next
last
this
today
tomorrow
yesterday
$knownDate = Carbon::create(2001, 5, 21, 12); // create testing date
Carbon::setTestNow($knownDate); // set the mock
echo new Carbon('tomorrow'); // 2001-05-22 00:00:00 ... notice the time !
echo new Carbon('yesterday'); // 2001-05-20 00:00:00
echo new Carbon('next wednesday'); // 2001-05-23 00:00:00
echo new Carbon('last friday'); // 2001-05-18 00:00:00
echo new Carbon('this thursday'); // 2001-05-24 00:00:00
Carbon::setTestNow(); // always clear it !
请注意,类似于next(),previous()和modify()方法,其中一些相对修饰符会将时间设置为00:00:00。
2.4 构造日期
$year = 2000; $month = 4; $day = 19;
$hour = 20; $minute = 30; $second = 15; $tz = 'Asia/Hong_Kong';
echo Carbon::createFromDate($year, $month, $day, $tz)."\n"; //2000-04-19 10:18:22
echo Carbon::createFromTime($hour, $minute, $second, $tz)."\n"; //2019-05-01 20:30:15
echo Carbon::create($year, $month, $day, $hour, $minute, $second, $tz)."\n"; //2000-04-19 20:30:15
createFromDate()将默认时间到现在。createFromTime()将日期默认为今天
2.5日期操作
默认的DateTime提供了几种不同的方法,可以轻松地添加和减去时间。 有modify(),add()和sub()
$dt = Carbon::create(2012, 1, 31, 0);
echo $dt->toDateTimeString(); // 2012-01-31 00:00:00
echo $dt->addCenturies(5); // 2512-01-31 00:00:00
echo $dt->addCentury(); // 2612-01-31 00:00:00
echo $dt->subCentury(); // 2512-01-31 00:00:00
echo $dt->subCenturies(5); // 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->addQuarters(2); // 2012-07-31 00:00:00
echo $dt->addQuarter(); // 2012-10-31 00:00:00
echo $dt->subQuarter(); // 2012-07-31 00:00:00
echo $dt->subQuarters(2); // 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
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
echo $dt->addMilliseconds(61); // 2012-02-03 00:00:00
echo $dt->addMillisecond(); // 2012-02-03 00:00:00
echo $dt->subMillisecond(); // 2012-02-03 00:00:00
echo $dt->subMillisecond(61); // 2012-02-03 00:00:00
echo $dt->addMicroseconds(61); // 2012-02-03 00:00:00
echo $dt->addMicrosecond(); // 2012-02-03 00:00:00
echo $dt->subMicrosecond(); // 2012-02-03 00:00:00
echo $dt->subMicroseconds(61); // 2012-02-03 00:00:00
// and so on for any unit: millenium, century, decade, year,
//quarter, month, week, day, weekday, hour, minute, second, microsecond.
//依此类推任何单位:千禧年,世纪,十年,年,
//季,月,周,日,工作日,小时,分钟,秒,微秒。
3.Carbon在Laravel中的使用
Laravel 中默认使用的时间处理类就是 Carbon。
Laravel 项目已默认安装了nesbot/carbon包。
2.6日期比较
通过以下功能提供简单的比较。请记住,比较是在UTC时区完成的,所以事情并不总是如此。
- min –返回最小日期。
- max – 返回最大日期。
- eq – 判断两个日期是否相等。
- gt – 判断第一个日期是否比第二个日期大。
- lt – 判断第一个日期是否比第二个日期小。
- gte – 判断第一个日期是否大于等于第二个日期。
- lte – 判断第一个日期是否小于等于第二个日期。
$first = Carbon::create(2012, 9, 5, 23, 26, 11,'UTC');
$second = Carbon::create(2012, 9, 5, 20, 26, 11, 'America/Vancouver');
echo $first->toDateTimeString(); // 2012-09-05 23:26:11
echo $first->tzName; // UTC
echo $second->toDateTimeString(); // 2012-09-05 20:26:11
echo $second->tzName; // America/Vancouver
var_dump($first->eq($second)); // bool(true)
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)
要确定当前实例是否在两个其他实例之间,您可以使用恰当命名的between()方法(或isBetween()别名)。 第三个参数表示是否应该进行等于比较。 默认值为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)
var_dump(Carbon::create(2012, 9, 5, 5)->isBetween($first, $second, false)); // bool(false)
2.7 Difference for Humans
1 month ago与30天前相比,人类更容易阅读。这是在大多数日期库中看到的常见功能,所以我想我也会在这里添加它。该函数的唯一参数是要比对的另一个Carbon实例,当然now()如果未指定则默认为。
此方法将在相对于实例和传入实例的差值之后添加一个短语。有4种可能性:
将过去的值与默认值进行比较时:
- 1小时前
- 5个月前
将未来的值与默认值进行比较时:
- 从现在起1小时
- 从现在起5个月
将过去的值与另一个值进行比较时:
- 1小时前
- 5个月前
将未来的值与另一个值进行比较时:
- 1小时后
- 5个月后
// The most typical usage is for comments
// The instance is the date the comment was created and its being compared to default now()
echo Carbon::now()->subDays(5)->diffForHumans(); // 5 days ago
echo Carbon::now()->diffForHumans(Carbon::now()->subYear()); // 11 months after
$dt = Carbon::createFromDate(2011, 8, 1);
echo $dt->diffForHumans($dt->copy()->addMonth()); // 1 month before
echo $dt->diffForHumans($dt->copy()->subMonth()); // 1 month after
echo Carbon::now()->addSeconds(5)->diffForHumans(); // in 4 seconds
echo Carbon::now()->subDays(24)->diffForHumans(); // 3 weeks ago
echo Carbon::now()->subDays(24)->longAbsoluteDiffForHumans(); // 3 weeks
echo Carbon::parse('2019-08-03')->diffForHumans('2019-08-13'); // 1 week before
echo Carbon::parse('2000-01-01 00:50:32')->diffForHumans('@946684800'); // 50 minutes after
echo Carbon::create(2018, 2, 26, 4, 29, 43)->longRelativeDiffForHumans(Carbon::create(2016, 6, 21, 0, 0, 0), 6);
// 1 year 8 months 5 days 4 hours 29 minutes 43 seconds after
3.1Laravel本地化
Laravel 中默认使用的时间处理类就是 Carbon
可以在 app/Providers/AppServiceProvider.php
的 boot()
方法中添加下面的代码来设置全局本地化:
public function boot()
{
\Carbon\Carbon::setLocale('zh');
}
更多用法请参考文档:Carbon手册