Carbon – 继承自 PHP DateTime 类的 API 扩展

Carbon 是php的日期处理类库(A simple PHP API extension for DateTime.)。

Carbon 继承了PHP的 Datetime 类,所以 Carbon 中没有涉及到的,但在 Datetime 中已经实现的方法都是可以使用的。

官网:https://carbon.nesbot.com/

1563019788649490

安装:

1
composer require nesbot/carbon

使用:

1
2
3
4
require 'vendor/autoload.php';
use Carbon\Carbon;  //通过命名空间导入 Carbon 来使用,而不需每次都提供完整的名称。
printf("Now: %s", Carbon::now());

相关用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//获取当前的日期和时间
echo Carbon::now();                 //2019-07-13 08:20:46
echo \Carbon\Carbon::now();         //2019-07-13 08:20:46
// 不传入时区参数的话,默认使用 php.ini配置的默认时区
// 获取指定时区下的当前时间
// DateTime对象可以在PHP官网找到详细的描述: http://php.net/manual/en/datetime.construct.php
$date = new DateTime(null, new DateTimeZone('Asia/Shanghai'));
echo $date->format('Y-m-d H:i:s');
//当你正在使用的 DateTime 实例是通过实例化其他继承了 \DateTime 库而得到的,
//通过下边的方式仍然可以极其友好创建 Carbon 实例。
$dt = new \DateTime('first day of January 2008'); // <== instance from another API
$carbon = Carbon::instance($dt);
echo get_class($carbon);                               // 'Carbon\Carbon'
echo $carbon->toDateTimeString();                      // 2008-01-01 00:00:00

获取当前时区的时间:

1
2
3
echo Carbon::now("PRC");            //2019-07-13 16:20:46
echo Carbon::now("Asia/Shanghai");  //2019-07-13 16:20:46
echo Carbon::now(new DateTimeZone('Asia/Shanghai'));    //2019-07-13 16:20:46

除 now() 外,还提供了 today()、tomorrow()、yesterday() 等静态函数,不过,它们的时间都是 00:00:00 :

1
2
3
4
echo Carbon::now("Asia/Shanghai");        // 获取当前时间,2019-07-13 16:47:20 
echo Carbon::today("Asia/Shanghai");       // 获取今天的开始时间,2019-07-13 00:00:00 
echo Carbon::tomorrow("Asia/Shanghai");      // 获取明天的开始时间,2019-07-14 00:00:00 
echo Carbon::yesterday("Asia/Shanghai");     // 获取昨天的开始时间,2019-07-12 00:00:00

以上输出结果其实是一个 Carbon 类型的日期时间对象:

1
2
3
4
5
6
var_dump(Carbon::now("PRC"));
object(Carbon\Carbon)[3]  
  public 'date' => string '2019-07-13 16:49:12.668932' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'PRC' (length=3)

获取字符串类型的日期—-日期类型转为字符串

如上所述,默认情况下,Carbon 的方法返回的为一个日期时间对象。虽然它是一个对象,但是你却可以直接使用 echo 输出结果,因为有 __toString 魔术方法。但是如果你想把它转为字符串,可以使用 toDateString 或 toDateTimeString 方法:

1
2
var_dump( Carbon::now()->toDateString());       //string '2019-07-13'
var_dump( Carbon::now()->toDateTimeString());   //string '2019-07-13 08:30:43'

解析时间—-使用 parse 方法解析任何顺序和类型的日期(结果为 Carbon 类型的日期时间对象):

这个功能可以说是非常强大了,需要特别注意的是如果parse的字符串内部有带时区,那么解析后的对象也是自带时区的,可能跟当前时区是不一样的。

1
2
3
4
5
6
7
8
9
10
11
12
13
var_dump(Carbon::parse('2016-10-15')->toDateTimeString());        //string '2016-10-15 00:00:00'
var_dump(Carbon::parse('2016-10-15 00:10:25')->toDateTimeString());   //string '2016-10-15 00:10:25'
var_dump(Carbon::parse('today')->toDateTimeString());                 //string '2019-07-13 00:00:00'
var_dump(Carbon::parse('yesterday')->toDateTimeString());             //string '2019-07-12 00:00:00'
var_dump(Carbon::parse('tomorrow')->toDateTimeString());              //string '2019-07-14 00:00:00'
var_dump(Carbon::parse('2 days ago')->toDateTimeString());            //string '2019-07-11 08:53:44'
var_dump(Carbon::parse('+3 days')->toDateTimeString());               //string '2019-07-16 08:53:44'
var_dump(Carbon::parse('+2 weeks')->toDateTimeString());              //string '2019-07-27 08:53:44'
var_dump(Carbon::parse('+4 months')->toDateTimeString());             //string '2019-11-13 08:53:44'
var_dump(Carbon::parse('-1 year')->toDateTimeString());               //string '2018-07-13 08:53:44'
var_dump(Carbon::parse('next wednesday')->toDateTimeString());        //string '2019-07-17 00:00:00'
var_dump(Carbon::parse('last friday')->toDateTimeString());           //string '2019-07-12 00:00:00'

构造日期–你还可以使用单独的年月日来构造日期(还可以传递一个有效的时区作为最后一个参数):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Carbon::createFromDate($year, $month, $day, $tz);//默认返回当前时间
Carbon::createFromTime($hour, $minute, $second, $tz);//日期默认是今天
Carbon::create($year, $month, $day, $hour, $minute, $second, $tz);//所有为 null 的参数都将默认为当前对应的时间
Carbon::createFromFormat('Y-m-d H''1975-05-21 22')->toDateTimeString(); // 1975-05-21 22:00:00
Carbon::createFromTimestamp(-1)->toDateTimeString();                      // 1969-12-31 23:59:59
$year  = '2019';
$month = '07';
$day   = '13';
echo Carbon::createFromDate($year, $month, $day);         //2019-07-13 08:59:34
echo Carbon::createFromDate($year, $month, $day,'Asia/Shanghai'); //2019-07-13 17:06:34
$hour   = '16';
$minute = '59';
$second = '00';
echo Carbon::create($year, $month, $day, $hour, $minute, $second);         //2019-07-13 16:59:00
echo Carbon::create($year, $month, $day, $hour, $minute, $second,'Asia/Shanghai'); //2019-07-13 16:59:00
echo Carbon::createFromDate(null, 12, 25);           //年默认为当前年份 2019-12-25 08:59:34
echo Carbon::createFromDate(null, 12, 25,'Asia/Shanghai');   //年默认为当前年份 2019-12-25 17:06:34

日期操作—-时间计算: add、sub、modify

日期操作可以通过 add (增加)或 sub (减去)跟上要增加或减去的单位来完成。

例如,你想给一个日期增加指定的天数,你可以使用 addDays 方法。

此外还提供了一个 modify 方法,参数格式为 + 或 – 跟上值及单位。所以,如果你想给当前日期增加一年,你可以传递 +1 year:

1
2
3
4
5
6
7
8
//当前时间2019-07-13
echo Carbon::now()->addDays(2);   //2019-07-15 09:17:10
echo Carbon::now()->addWeeks(3);  //2019-08-03 09:17:10
echo Carbon::now()->addHours(25); //2019-07-14 10:17:10
echo Carbon::now()->subHours(2);  //2019-07-13 07:17:10
echo Carbon::now()->addHours(2)->addMinutes(12); //2019-07-13 11:29:10
echo Carbon::now()->modify('+15 days');          //2019-07-28 09:17:10
echo Carbon::now()->modify('-2 days');           //2019-07-11 09:17:10

日期比较:

min – 返回最小日期。

max – 返回最大日期。

eq  – 判断两个日期是否相等。

gt  – 判断第一个日期是否比第二个日期大。

lt  – 判断第一个日期是否比第二个日期小。

gte – 判断第一个日期是否大于等于第二个日期。

lte – 判断第一个日期是否小于等于第二个日期。

1
2
3
4
5
6
7
8
9
10
11
12
13
$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-05 23:26:11
echo $second->toDateTimeString();                  // 2012-09-05 20:26:11
var_dump($first->eq($second));                     // boolean false
var_dump($first->ne($second));                     // boolean true
var_dump($first->gt($second));                     // boolean false
var_dump($first->gte($second));                    // boolean false
var_dump($first->lt($second));                     // boolean true
var_dump($first->lte($second));                    // boolean true

要判断一个日期是否介于两个日期之间,可以使用 between() 方法,第三个可选参数指定比较是否可以相等,默认为 true:

1
2
3
4
5
$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)

 diffForHumans(Carbon $other, true)。

“一个月前”比“30 天前”更便于阅读,很多日期库都提供了这个常见的功能,日期被解析后,有下面四种可能性:

当比较的时间超过当前默认时间:1天前 5月前

当用将来的时间与当前默认时间比较: 1小时距现在,5月距现在

当比较的值超过另一个值

1小时前

5月前

当比较的值在另一个值之后

1小时后

5月后

你可以把第二个参数设置为 true 来删除“前”、“距现在”等修饰语

Carbon::setLocale(‘zh’);        //carbon => diffForHumans => 本地化

1
2
3
4
5
6
7
8
9
10
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周

关于毫秒的一些处理:

//php自带的 DateTime 类也可以设置毫秒,但是在进行日期的数学预算时并不会考虑毫秒。

//从 Carbon 1.12.0版本起,实例化、copy也能像 format() 方法一样支持毫秒(PHP默认的只有 Datetime::format() 支持毫秒)。

1
2
3
$dt = Carbon::parse('1975-05-21 22:23:00.123456');
echo $dt->micro;           // 123456
echo $dt->copy()->micro;   // 123456

 

获取指定格式输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
$dt = Carbon::create(2019, 7, 14, 00, 24, 00);
echo $dt->startOfDay();     // 2019-07-14 00:00:00
echo "<br>";
echo $dt->endOfDay();       // 2019-07-14 23:59:59
echo "<br>";
echo $dt->startOfMonth();   // 2019-07-01 00:00:00
echo "<br>";
echo $dt->endOfMonth();     // 2019-07-31 23:59:59
echo "<br>";
echo $dt->startOfYear();    // 2019-01-01 00:00:00
echo "<br>";
echo $dt->endOfYear();      // 2019-12-31 23:59:59
//上个月第一天、上个月最后一天、这个月第一天、这个月最后一天----获取时间格式:
Carbon::now()->subMonth()->firstOfMonth();    //2019-06-01 00:00:00
Carbon::now()->subMonth()->lastOfMonth();     //2019-06-30 00:00:00
Carbon::now()->firstOfMonth();                //2019-07-01 00:00:00
Carbon::now()->lastOfMonth();                 //2019-07-31 00:00:00
//上个月第一天、上个月最后一天、这个月第一天、这个月最后一天----时间戳格式:
Carbon::now()->subMonth()->firstOfMonth()->timestamp;    //1559318400  对应:2019/6/1 0:0:0
Carbon::now()->subMonth()->lastOfMonth()->timestamp;     //1561824000  对应:2019/6/30 0:0:0
Carbon::now()->firstOfMonth()->timestamp;                //1561910400 对应:2019/7/1 0:0:0
Carbon::now()->lastOfMonth()->timestamp;                 //1564502400 对应:2019/7/31 0:0:0
//本月第一天,上月第一天
new Carbon('first day of this month');    //2019-07-01 00:07:10
new Carbon('first day of last month');    //2019-06-01 00:10:42
//昨天、今天、明天
Carbon::yesterday()->toDateString();// 2019-07-13
Carbon::today()->toDateString();    // 2019-07-14  
Carbon::tomorrow()->toDateString(); // 2019-07-15
//上个月、下个月
$first_day = new Carbon('last month');
echo $first_day->format('Y-m');           //2019-07
//当前时间
Carbon::now(); //2019-07-14 00:19:46
//时间差:
$start  = new Carbon('2018-10-04 15:00:03');
$end    = new Carbon('2018-10-05 17:00:09');
echo $start->diff($end)->format('%H:%I:%S');    //02:00:06
//星期常量--可以通过下面的常量来代替一周中的第几天
var_dump(Carbon::SUNDAY);        // int(0)
var_dump(Carbon::MONDAY);        // int(1)
var_dump(Carbon::TUESDAY);       // int(2)
var_dump(Carbon::WEDNESDAY);     // int(3)
var_dump(Carbon::THURSDAY);      // int(4)
var_dump(Carbon::FRIDAY);        // int(5)
var_dump(Carbon::SATURDAY);      // int(6)
=============================================================
var_dump( Carbon::now()->year);     //int 2019
var_dump( Carbon::now()->month);    //int 7
var_dump( Carbon::now()->day);      //int 13
var_dump( Carbon::now()->hour);     //int 13
var_dump( Carbon::now()->minute);   //int 26
var_dump( Carbon::now()->second);   //int 47
var_dump( Carbon::now()->micro);    //int 501534
var_dump( Carbon::now()->dayOfWeek);   //int 6,获取今天是星期几,直接返回一个数字
var_dump( Carbon::parse('2019-02-01 23:26:11.123789')->dayOfYear);   //int 32
var_dump( Carbon::now()->weekOfMonth);  //int 2
var_dump( Carbon::parse('2019-07-13 23:26:11.123789')->weekOfMonth);   //int 2
var_dump( Carbon::now()->weekOfYear);   //int 28
var_dump( Carbon::now()->daysInMonth);  //int 31
var_dump( Carbon::now()->timestamp);    //int 1563024713,当前时间戳
var_dump( Carbon::createFromDate(1975, 5, 21)->age);    //int 44,指定时间到现在多少岁
var_dump( Carbon::now()->quarter);      //int 3,第几季度
var_dump( Carbon::parse('2019-06-30 23:26:11')->quarter);      //int 2,第几季度
=========================================================================
Carbon::now()->addYear();    //2020-07-13 14:54:22
Carbon::now()->addYears(2);  //2021-07-13 14:54:43
Carbon::now()->subYear();    //2018-07-13 14:55:09
Carbon::now()->subYears(2);  //2017-07-13 14:55:29
Carbon::now()->addMonth();     //2019-08-13 13:51:27
Carbon::now()->addMonths(2);   //2019-09-13 13:51:27
Carbon::now()->subMonth();     //2019-06-13 13:52:36
Carbon::now()->subMonths(2);   //2019-05-13 13:52:36
Carbon::now()->addDay();    //2019-07-14 14:56:00
Carbon::now()->addDays(2);  //2019-07-15 14:56:43
Carbon::now()->subDay();    //2019-07-12 14:57:05
Carbon::now()->subDays();  //2019-07-12 14:57:30
Carbon::now()->addWeekday();    //2019-07-15 14:58:12
Carbon::now()->addWeekdays(2);  //2019-07-16 14:59:22
Carbon::now()->subWeekday();    //2019-07-12 15:00:01
Carbon::now()->subWeekdays(2);  //2019-07-11 15:00:21
addWeek、addWeeks、subWeek、subWeeks
addHour、addHours、subHour、subHours
addMinute、addMinutes、subMinute、subMinutes
addSecond、addSeconds、subSecond、subSeconds
=============================================================
Carbon::now()->subDays(5)->diffForHumans(); // 5天前
Carbon::now()->toDateTimeString();
Carbon::now()->formatLocalized('%Y.%m.%d %A %H:%I:%M');//string '2019.07.13 Saturday 23:11:52'
============================================================
$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) -> default compare it to today!
//改变 now() 为任意你想要的时间
$knownDate = Carbon::create(2001, 5, 21, 12);  // 创建测试日期
Carbon::setTestNow($knownDate);                     // set the mock
echo Carbon::now();                                 // 2001-05-21 12:00:00
 收藏 (0) 打赏

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

未经允许不得转载:小林博客 www.vvso.cn小林博客 » Carbon – 继承自 PHP DateTime 类的 API 扩展
分享到: 更多 (0)

评论 抢沙发

切换注册

登录

忘记密码 ?

切换登录

注册