简介
在PHP中处理日期和时间可能很复杂。我们必须处理`strtotime‘、格式化问题、大量计算等等。
Carbon包可以帮助我们更轻松、更具语义性地处理日期和时间,从而使我们的代码更具可读性和可维护性。
Carbon是由Brian Nesbit)提供的一个包,它扩展了php自己的DateTime类。
它提供了一些很好的功能来处理PHP中的日期。具体地说,比如:
- 处理时区。
- 轻松获取当前时间。
- 将日期时间转换为可读内容。
- 将英文短语解析为DateTime(`)。
- 加减日期(`)。
- 处理日期的语义方式。
在本文中,您将安装Carbon并探索它提供的特性和功能。
预约
要遵循本指南,您需要满足以下先决条件:
- 工作的Laravel开发环境。要进行设置,您可以按照我们的指南如何在Ubuntu 20.04.上安装和配置Laravel应用程序 -或者,遵循The Larvel Installation documentation.如果您选择了Laravel Sail方法,您将需要Docker。
本教程已通过PHP v8.0.5、Composer v2.0.13、MySQL 8.0.24、Laravel v8.40.0和Carbon v2.31验证。
设置项目
为了使用Carbon,您需要从`Carbon‘命名空间导入Carbon。对我们来说幸运的是,碳已经包含在Laravel中。
每当我们需要使用碳时,我们可以像这样进口它:
1<?php
2use Carbon\Carbon;
在进口之后,让我们探索一下碳提供了什么。
获取具体日期和时间
获取当前时间:
1$current = Carbon::now();
还可以使用此实例化来检索当前时间:
1$current2 = new Carbon();
获取今天的日期:
1$today = Carbon::today();
获取昨天的日期:
1$yesterday = Carbon::yesterday();
获取明天的日期:
1$tomorrow = Carbon::tomorrow();
解析特定字符串:
1$newYear = new Carbon('first day of January 2016');
这将返回:
1[secondary_label Output]
22016-01-01 00:00:00
这些帮助器为频繁的日期和时间需求提供人类可读的请求,如Today()
、Today()
和Tomorrow()
。
创建更细粒度控制的日期
除了定义日期和时间的快捷方法外,Carbon还让我们从特定数量的参数创建日期和时间。
createFromDate()
接受$Year
、$Month
、$day
、$tz
(时区):
1Carbon::createFromDate($year, $month, $day, $tz);
createFromTime()
接受$hour
、$minute
、$Second
和$tz
(时区):
1Carbon::createFromTime($hour, $minute, $second, $tz);
Create()
接受$年
、$Month
、$day
、$hour
、$minute
、$Second
、$tz
(时区):
1Carbon::create($year, $month, $day, $hour, $minute, $second, $tz);
当您以Carbon通常无法识别的格式获取某种日期或时间时,这些非常有用。如果你为这些属性中的任何一个传入null,它将默认为current。
操作日期和时间
在处理日期时,获取日期和时间并不是唯一需要做的事情。您将经常需要操纵日期或时间。
例如,在为用户创建试用期时,您会希望试用期在一定时间后到期。因此,假设我们有30天的试用期。我们可以用碳的‘加法’和‘减法’来计算时间。
在本例中,我们可以使用addDays()
来判断试用期何时到期:
1// get the current time
2$current = Carbon::now();
3
4// add 30 days to the current time
5$trialExpires = $current->addDays(30);
在Carbon documentation,中,我们可以使用一些其他的Add()
和Sub()
方法。
考虑将日期设置为2012年1月31日:
1$dt = Carbon::create(2012, 1, 31, 0);
2
3echo $dt->toDateTimeString();
这将返回:
1[secondary_label Output]
22012-01-31 00:00:00
使用addYears()
和subYears()
修改日期将导致以下结果:
| 命令|输出|
| - -|- -|
| echo $dt->addYear();
| 2012-01-31 00:00:00|
| echo $dt->addYears(5);
| 2017-01-31 00:00:00|
| echo $dt->subYear();
| 2011-01-31 00:00:00|
| echo $dt->subYears(5);
| 2007-01-31 00:00:00|
使用addMonths()
和subMonths()
修改日期将导致以下结果:
| 命令|输出|
| - -|- -|
| echo $dt->addMonth();
| 2012-03-03 00:00:00|
| echo $dt->addMonths(60);
| 2017-01-31 00:00:00|
| echo $dt->subMonth();
| 2011-12-31 00:00:00|
| echo $dt->subMonths(60);
| 2007-01-31 00:00:00|
请注意,在)`。
使用addDays()
和subDays()
修改日期将导致以下结果:
命令|输出
-|
ECHO$dt->addDay();
|2012-02-01 00:00:00
ECHO$dt->addDays(29);
|2012-02-29 00:00:00
ECHO$dt->subDay();
|2012-01-30 00:00:00
ECHO$dt->subDays(29);
|2012-01-02 00:00:00
使用addWeekday()
和subWeekday()
修改日期将导致以下结果:
命令|输出
-|
ECHO$dt->addWeekday();
|2012-02-01 00:00:00
ECHO$dt->addWeekday(4);
|2012-02-06 00:00:00
ECHO$dt->subWeekday();
|2012-01-30 00:00:00
ECHO$dt->subWeekday(4);
|2012-01-25 00:00:00
使用addWeeks()
和subWeeks()
修改日期将导致以下结果:
命令|输出
-|
ECHO$dt->addWeek();
|2012-02-07 00:00:00
ECHO$dt->addWeek(3);
|2012-02-21 00:00:00
ECHO$dt->subWeek();
|2012-01-24 00:00:00
ECHO$dt->subWeek(3);
|2012-01-10 00:00:00
使用addHour()
和subHour()
修改日期将导致以下结果:
| 命令|输出|
| - -|- -|
| echo $dt->addHour();
| 2012-01-31 01:00:00|
| echo $dt->addHours(24);
| 2012-02-01 00:00:00|
| echo $dt->subHour();
| 2012-01-30 23:00:00|
| echo $dt->subHours(24);
| 2012-01-30 00:00:00|
使用addMinents()
和subMinmins()
修改日期将导致以下结果:
| 命令|输出|
| - -|- -|
| echo $dt->addMinute();
| 2012-01-31 00:01:00|
| echo $dt->addMinutes(61);
| 2012-01-31 01:01:00|
| echo $dt->subMinute();
| 2012-01-30 23:59:00|
| echo $dt->subMinutes(61);
| 2012-01-30 22:59:00|
用addSecond()
和subSecond()
修改日期会导致如下结果:
命令|输出
-|
ECHO$dt->addSecond();
|2012-01-31 00:00:01
ECHO$dt->addSecond(61);
|2012-01-31 00:01:01
ECHO$dt->subSecond();
|2012-01-30 23:59:59
ECHO$dt->subSecond(61);
|2012-01-30 23:58:59
使用Carbon的add
和subtract
工具可以为您提供调整后的日期和时间。
使用getters和setters
另一种读取或操纵时间的方法是使用Carbon的getter和setter。
使用Getters读取值:
1$dt = Carbon::now();
2
3var_dump($dt->year);
4var_dump($dt->month);
5var_dump($dt->day);
6var_dump($dt->hour);
7var_dump($dt->second);
8var_dump($dt->dayOfWeek);
9var_dump($dt->dayOfYear);
10var_dump($dt->weekOfMonth);
11var_dump($dt->daysInMonth);
使用setter更改值:
1$dt = Carbon::now();
2
3$dt->year = 2015;
4$dt->month = 04;
5$dt->day = 21;
6$dt->hour = 22;
7$dt->minute = 32;
8$dt->second = 5;
9
10echo $dt;
我们甚至可以用链子锁住一些二传手。
以下是上一个使用Year()
、Month()
、day()
、hr()
、Minor()
和Second()
的示例:
1$dt->year(2015)->month(4)->day(21)->hour(22)->minute(32)->second(5)->toDateTimeString();
下面是使用setDate()
和setTime()
的相同示例:
1$dt->setDate(2015, 4, 21)->setTime(22, 32, 5)->toDateTimeString();
下面是使用setDateTime()
的相同示例:
1$dt->setDateTime(2015, 4, 21, 22, 32, 5)->toDateTimeString();
所有这些方法都会产生相同的结果:2015-04-21 22:32:05
。
格式化日期和时间
PHP的toXXXString()
方法可用于以预定义的格式显示日期和时间:
命令|输出
-|
ECHO$DT->toDateString();
|2015-04-21
ECHO$DT->toFormattedDateString();
|2015年04月21日
ECHO$dt->toTimeString();
|22:32:05
ECHO$dt->toDateTimeString();
|2015-04-21 22:32:05
ECHO$dt->toDayDateTimeString();
|2015年4月21日星期二晚上10:32
也可以使用php的DateTime
format()
进行自定义格式化:
1echo $dt->format('l jS \of F Y h:i:s A');
- `l ':一周中的一天的完整文本表示。
jS
:- 月份中没有前导零的日期。
- 英文序数后缀,表示月份的日期,2个字符。
F
:一个月的完整文本表示。Y
:年份的完整数字表示,4位数字。h:i:s
:- 12小时格式的小时,前导为零。
- 带前导零的分钟数。
- 带前导零的秒。
A
:大写的Ante em和Post em。
此代码将产生以下结果:
1[secondary_label Output]
2Tuesday 21st of April 2015 10:32:05 PM
使用Carbon的格式化工具可以显示日期和时间,以满足您的需求。
计算相对时间
Carbon还允许我们使用`diff()方法相对地显示时间。
例如,假设我们有一个博客,想要显示3小时前
的发布时间。我们将能够用这些方法做到这一点。
找出差异
考虑以下具有未来时间和过去时间的示例:
1$dt = Carbon::create(2012, 1, 31, 0);
2$future = Carbon::create(2012, 1, 31, 0);
3$past = Carbon::create(2012, 1, 31, 0);
4
5$future = $future->addHours(6);
6$past = $past->subHours(6);
下面是使用diffInHours()
的结果:
| 命令|输出|
| - -|- -|
| echo $dt->diffInHours($future);
|六号|
| echo $dt->diffInHours($past);
| 六号|
考虑以下具有未来日期和过去日期的示例:
1$dt = Carbon::create(2012, 1, 31, 0);
2$future = Carbon::create(2012, 1, 31, 0);
3$past = Carbon::create(2012, 1, 31, 0);
4
5$future = $future->addMonth();
6$past = $past->subMonths(2);
以下是使用DiffInDays()
得到的结果:
命令|输出
-|
ECHO$DT->DiffInDays($Future);
|31
ECHO$DT->DiffInDays($PASS);
|61
人类的差异
相对时间有时比日期或时间戳对读者更有用。
例如,不会像8:12 AM
那样显示帖子的时间,而是会显示为`3小时前‘。
diffForHumans()方法用于计算差异并将其转换为人类可读的格式。
考虑下面的示例,其中日期在未来,日期在过去:
1$dt = Carbon::create(2012, 1, 31, 0);
2$future = Carbon::create(2012, 1, 31, 0);
3$past = Carbon::create(2012, 1, 31, 0);
4
5$future = $future->addMonth();
6$past = $past->subMonth();
下面是使用diffForHumans()
的结果:
命令|输出
-|
ECHO$DT->DiffForHumans($Future);
|前1个月
ECHO$DT->DiffForHumans($PASS);
|1个月后
结论
在本文中,您安装了Carbon并探索了它提供的特性和功能。
如果您想了解更多关于Laravel的信息,请查看我们的Laravel主题页面获取练习和编程项目。如果您想了解更多关于php的知识,请查看我们的php主题页面获取练习和编程项目。