如何在 Laravel 和 PHP 中使用 Carbon 管理日期时间

简介

在PHP中处理日期和时间可能很复杂。我们必须处理`strtotime‘、格式化问题、大量计算等等。

Carbon包可以帮助我们更轻松、更具语义性地处理日期和时间,从而使我们的代码更具可读性和可维护性。

Carbon是由Brian Nesbit)提供的一个包,它扩展了php自己的DateTime类。

它提供了一些很好的功能来处理PHP中的日期。具体地说,比如:

  • 处理时区。
  • 轻松获取当前时间。
  • 将日期时间转换为可读内容。
  • 将英文短语解析为DateTime(`)。
  • 加减日期(`)。
  • 处理日期的语义方式。

在本文中,您将安装Carbon并探索它提供的特性和功能。

预约

要遵循本指南,您需要满足以下先决条件:

本教程已通过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的addsubtract工具可以为您提供调整后的日期和时间。

使用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的DateTimeformat()进行自定义格式化:

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主题页面获取练习和编程项目。

Published At
Categories with 技术
Tagged with
comments powered by Disqus