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

介绍

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

包可以帮助交易日期和时间在PHP更容易和更语义,使我们的代码变得更具可读性和可维护性。

Carbon 是Brian Nesbit 的一个包,它扩展了 PHP 自己的DateTime类。

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

  • 处理时区。
  • 轻松获取当前时间。
  • 将日期时间转换为可读的内容。
  • 将英语短语解析为日期时间 ( "first day of January 2016")。
  • 添加和减去日期 ( "+ 2 weeks", "-6 months")。
  • 处理日期的语义方式。

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

先决条件

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

本教程已通过 PHP v8.0.5、Composer v2.0.13、MySQL 8.0.24、Laravel v8.40.0 和 Carbon v2.31 验证。

设置项目

为了使用 Carbon,您需要从Carbon命名空间导入 Carbon 对我们来说幸运的是,Carbon 已经包含在 Laravel 中。

每当我们需要使用 Carbon 时,我们可以像这样导入它:

<?php
use Carbon\Carbon;

导入后,我们来探索一下Carbon 提供了什么。

获取特定日期和时间

获取当前时间:

$current = Carbon::now();

也可以使用此实例化检索当前时间:

$current2 = new Carbon();

获取今天的日期:

$today = Carbon::today();

获取昨天的日期:

$yesterday = Carbon::yesterday();

获取明天的日期:

$tomorrow = Carbon::tomorrow();

解析特定字符串:

$newYear = new Carbon('first day of January 2016');

这将返回:

Output
2016-01-01 00:00:00

这些助手提供人类可读频繁的日期和时间需要像请求today()yesterday()tomorrow()

使用更细粒度的控制创建日期

除了定义日期和时间的快速方法之外,Carbon 还让我们根据特定数量的参数创建日期和时间。

createFromDate()接受$year, $month, $day, $tz(时区):

Carbon::createFromDate($year, $month, $day, $tz);

createFromTime()接受$hour$minute$second$tz(时区):

Carbon::createFromTime($hour, $minute, $second, $tz);

create()接受$year, $month, $day, $hour, $minute, $second, $tz(时区):

Carbon::create($year, $month, $day, $hour, $minute, $second, $tz);

当您以 Carbon 通常无法识别的格式获取某种日期或时间时,这些非常有用。如果您传入null这些属性的任何一个,它将默认为当前。

操作日期和时间

在处理日期时,获取日期和时间并不是您唯一需要做的事情。您经常需要操纵日期或时间。

例如,在为用户创建试用期时,您希望试用期在一定时间后到期。假设我们有 30 天的试用期。我们可以用 Carbonadd来计算那个时间subtract

对于此示例,我们可以使用addDays()来确定试用期何时到期:

// get the current time
$current = Carbon::now();

// add 30 days to the current time
$trialExpires = $current->addDays(30);

Carbon 文档 中,这里有一些我们可以使用的其他方法add()sub()方法。

考虑设置为 2012 年 1 月 31 日的日期:

$dt = Carbon::create(2012, 1, 31, 0);

echo $dt->toDateTimeString();

这将返回:

Output
2012-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

请注意如何将“1 月 31 日”增加一个月会导致“3 月 3 日”而不是“2 月 28 日”。如果您不想进行翻转,则可以使用addMonthWithoutOverflow().

使用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

使用addWeekdays()修改日期subWeekdays()将导致以下结果:

命令 输出
echo $dt->addWeekday(); 2012-02-01 00:00:00
echo $dt->addWeekdays(4); 2012-02-06 00:00:00
echo $dt->subWeekday(); 2012-01-30 00:00:00
echo $dt->subWeekdays(4); 2012-01-25 00:00:00

使用addWeeks()修改日期subWeeks()将导致以下结果:

命令 输出
echo $dt->addWeek(); 2012-02-07 00:00:00
echo $dt->addWeeks(3); 2012-02-21 00:00:00
echo $dt->subWeek(); 2012-01-24 00:00:00
echo $dt->subWeeks(3); 2012-01-10 00:00:00

使用addHours()修改日期subHours()将导致以下结果:

命令 输出
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

使用addMinutes()修改日期subMinutes()将导致以下结果:

命令 输出
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

使用addSeconds()修改日期subSeconds()将导致以下结果:

命令 输出
echo $dt->addSecond(); 2012-01-31 00:00:01
echo $dt->addSeconds(61); 2012-01-31 00:01:01
echo $dt->subSecond(); 2012-01-30 23:59:59
echo $dt->subSeconds(61); 2012-01-30 23:58:59

使用 Carbonaddsubtract工具可以为您提供调整后的日期和时间。

使用 Getter 和 Setter

另一种读取或操作时间的方法是使用 Carbon 的 getter 和 setter。

使用 getter 读取值:

$dt = Carbon::now();

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   = 2015;
$dt->month  = 04;
$dt->day    = 21;
$dt->hour   = 22;
$dt->minute = 32;
$dt->second = 5;

echo $dt;

我们甚至可以将一些 setter 链接在一起。

这是上一个使用year(), month(), day(), hour(), minute(), 和 的示例second()

$dt->year(2015)->month(4)->day(21)->hour(22)->minute(32)->second(5)->toDateTimeString();

这是使用setDate()and的相同示例setTime()

$dt->setDate(2015, 4, 21)->setTime(22, 32, 5)->toDateTimeString();

这是使用相同的示例setDateTime()

$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 年 4 月 21 日
echo $dt->toTimeString(); 22:32:05
echo $dt->toDateTimeString(); 2015-04-21 22:32:05
echo $dt->toDayDateTimeString(); 2015 年 4 月 21 日星期二晚上 10:32

也可以使用 PHPDateTime format()进行自定义格式:

echo $dt->format('l jS \of F Y h:i:s A');
  • l: 星期几的全文表示。
  • jS

    • 一个月中没有前导零的日期。
    • 月份日期的英文序数后缀,2 个字符。
  • F: 一个月的全文表示。
  • Y: 一个完整的数字表示的年份,4 位数字。
  • h:i:s

    • 带前导零的小时的 12 小时格式。
    • 带前导零的分钟。
    • 带前导零的秒数。
  • A: 大写的 Ante meridiem 和 Post meridiem。

此代码将产生以下结果:

Output
Tuesday 21st of April 2015 10:32:05 PM

使用 Carbon 的格式化工具可以显示日期和时间以满足您的需求。

计算相对时间

Carbon 还让我们用这些diff()方法相对地显示时间

例如,假设我们有一个博客,想要显示3 hours ago. 我们将能够使用这些方法做到这一点。

寻找差异

考虑以下具有未来时间和过去时间的示例:

$dt      = Carbon::create(2012, 1, 31, 0);
$future  = Carbon::create(2012, 1, 31, 0);
$past    = Carbon::create(2012, 1, 31, 0);

$future  = $future->addHours(6);
$past    = $past->subHours(6);

以下是使用的结果diffInHours()

命令 输出
echo $dt->diffInHours($future); 6
echo $dt->diffInHours($past); 6

考虑以下带有未来日期和过去日期的示例:

$dt      = Carbon::create(2012, 1, 31, 0);
$future  = Carbon::create(2012, 1, 31, 0);
$past    = Carbon::create(2012, 1, 31, 0);

$future  = $future->addMonth();
$past    = $past->subMonths(2);

以下是使用的结果diffInDays()

命令 输出
echo $dt->diffInDays($future); 31
echo $dt->diffInDays($past); 61

显示人类的差异

相对地显示时间有时比日期或时间戳对读者更有用。

例如,不是像 那样显示帖子的时间,而是8:12 AM将时间显示为3 hours ago

diffForHumans()方法用于计算差异并将其转换为人类可读的格式。

考虑以下带有未来日期和过去日期的示例:

$dt      = Carbon::create(2012, 1, 31, 0);
$future  = Carbon::create(2012, 1, 31, 0);
$past    = Carbon::create(2012, 1, 31, 0);

$future  = $future->addMonth();
$past    = $past->subMonth();

以下是使用的结果diffForHumans()

命令 输出
echo $dt->diffForHumans($future); 1 month before
echo $dt->diffForHumans($past); 1 month after

结论

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

如果您想了解有关 Laravel 的更多信息,请查看我们的 Laravel 主题页面以获取练习和编程项目。如果您想了解有关 PHP 的更多信息,请查看我们的 PHP 主题页面以获取练习和编程项目。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁