Laravel의 날짜 및 시간 처리 패키지인 Carbon

巴扎黑
풀어 주다: 2023-03-16 11:52:01
원래의
9154명이 탐색했습니다.

날짜 형식, 시간대, 윤년, 날짜가 다른 월 등 날짜와 시간을 처리할 때 고려해야 할 사항이 많습니다. Laravel의 시간 처리 패키지 Carbon은 사용이 간편하며 도움이 필요한 친구들이 참조할 수 있습니다.

머리말

우리 모두는 PHP 애플리케이션을 작성할 때 날짜와 시간을 처리해야 하는 경우가 많습니다. 이 기사에서는 처리를 더 쉽게 해주는 PHP DateTime 클래스에서 상속된 API 확장인 Carbon에 대해 설명합니다. 날짜와 시간으로.

Laravel에서 사용되는 기본 시간 처리 클래스는 Carbon입니다.

<?php
namespace Carbon;
 
class Carbon extends \DateTime
{
 // code here
}
로그인 후 복사

Carbon 네임스페이스의 Carbon 클래스에서 위에서 선언한 코드 조각을 볼 수 있습니다.

Installation

Carbon은 Composer를 통해 설치할 수 있습니다:

composer require nesbot/carbon
로그인 후 복사

PS: Laravel 프로젝트에서는 기본적으로 이 패키지를 설치하므로 위 명령을 다시 실행할 필요가 없습니다.


을 사용하려면 매번 완전한 이름을 제공하지 않고 사용할 수 있도록 네임스페이스를 통해 Carbon을 가져와야 합니다.

use Carbon\Carbon;
로그인 후 복사

현재 시간 가져오기

now() 메서드를 사용하면 현재 날짜와 시간을 가져올 수 있습니다. 매개변수를 지정하지 않으면 PHP 구성의 시간대가 사용됩니다.

<?php
echo Carbon::now(); //2016-10-14 20:21:20
?>
로그인 후 복사

다른 시간대를 사용하려면 유효한 시간대를 매개변수로 전달해야 합니다.

// 直接使用字符串
echo Carbon::now(&#39;Europe/London&#39;); //2016-10-14 20:21:20
// 或者
echo Carbon::now(new DateTimeZone(&#39;Europe/London&#39;));
로그인 후 복사

제외 < code>now() 또한 today() , tomorrow()yesterday()와 같은 정적 함수는 그러나 시간은 모두 00:00:00입니다. now() 外,还提供了 today() tomorrow()yesterday() 等静态函数,不过,它们的时间都是 00:00:00 :

echo Carbon::now();        // 2016-10-14 15:18:34
echo Carbon::today();       // 2016-10-14 00:00:00
echo Carbon::tomorrow(&#39;Europe/London&#39;);       // 2016-10-14 00:00:00
echo Carbon::yesterday();       // 2016-10-14 00:00:00
로그인 후 복사

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

Carbon {#179 ▼
 +"date": "2016-06-14 00:00:00.000000"
 +"timezone_type": 3
 +"timezone": "UTC"
}
로그인 후 복사

要想获取字符串类型的日期,可以使用下面的代码:

echo Carbon::today()->toDateTimeString();
echo Carbon::yesterday()->toDateTimeString();
echo Carbon::tomorrow()->toDateTimeString();
로그인 후 복사

日期类型转为字符串

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

echo Carbon::now()->toDateString(); //2016-10-14
echo Carbon::now()->toDateTimeString(); //2016-10-14 20:22:50
로그인 후 복사

日期解析

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

echo Carbon::parse(&#39;2016-10-15&#39;)->toDateTimeString(); //2016-10-15 00:00:00
echo Carbon::parse(&#39;2016-10-15&#39;)->toDateTimeString(); //2016-10-15 00:00:00
echo Carbon::parse(&#39;2016-10-15 00:10:25&#39;)->toDateTimeString(); //2016-10-15 00:10:25
 
echo Carbon::parse(&#39;today&#39;)->toDateTimeString(); //2016-10-15 00:00:00
echo Carbon::parse(&#39;yesterday&#39;)->toDateTimeString(); //2016-10-14 00:00:00
echo Carbon::parse(&#39;tomorrow&#39;)->toDateTimeString(); //2016-10-16 00:00:00
echo Carbon::parse(&#39;2 days ago&#39;)->toDateTimeString(); //2016-10-13 20:49:53
echo Carbon::parse(&#39;+3 days&#39;)->toDateTimeString(); //2016-10-18 20:49:53
echo Carbon::parse(&#39;+2 weeks&#39;)->toDateTimeString(); //2016-10-29 20:49:53
echo Carbon::parse(&#39;+4 months&#39;)->toDateTimeString(); //2017-02-15 20:49:53
echo Carbon::parse(&#39;-1 year&#39;)->toDateTimeString(); //2015-10-15 20:49:53
echo Carbon::parse(&#39;next wednesday&#39;)->toDateTimeString(); //2016-10-19 00:00:00
echo Carbon::parse(&#39;last friday&#39;)->toDateTimeString(); //2016-10-14 00:00:00
로그인 후 복사

构造日期

你还可以使用单独的年月日来构造日期:

$year = &#39;2015&#39;;
$month = &#39;04&#39;;
$day = &#39;12&#39;;
 
echo Carbon::createFromDate($year, $month, $day); //2015-04-12 20:55:59
 
$hour = &#39;02&#39;;
$minute = &#39;15&#39;:
$second = &#39;30&#39;;
 
echo Carbon::create($year, $month, $day, $hour, $minute, $second); //2015-04-12 02:15:30
 
echo Carbon::createFromDate(null, 12, 25); // 年默认为当前年份
로그인 후 복사

此外,还可以传递一个有效的时区作为最后一个参数。

日期操作

日期操作可以通过 add (增加)或 sub (减去)跟上要增加或减去的单位来完成。例如,你想给一个日期增加指定的天数,你可以使用 addDays 方法。此外还提供了一个 modify 方法,参数格式为 + 或 - 跟上值及单位。所以,如果你想给当前日期增加一年,你可以传递 +1 year:

echo Carbon::now()->addDays(25); //2016-11-09 14:00:01
echo Carbon::now()->addWeeks(3); //2016-11-05 14:00:01
echo Carbon::now()->addHours(25); //2016-10-16 15:00:01
echo Carbon::now()->subHours(2); //2016-10-15 12:00:01
echo Carbon::now()->addHours(2)->addMinutes(12); //2016-10-15 16:12:01
echo Carbon::now()->modify(&#39;+15 days&#39;); //2016-10-30 14:00:01
echo Carbon::now()->modify(&#39;-2 days&#39;); //2016-10-13 14:00:01
로그인 후 복사

日期比较

在 Carbon 中你可以使用下面的方法来比较日期:

  • min –返回最小日期。

  • max – 返回最大日期。

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

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

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

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

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

echo Carbon::now()->tzName;            // America/Toronto
$first = Carbon::create(2012, 9, 5, 23, 26, 11);
$second = Carbon::create(2012, 9, 5, 20, 26, 11, &#39;America/Vancouver&#39;);
 
echo $first->toDateTimeString();          // 2012-09-05 23:26:11
echo $first->tzName;                // America/Toronto
echo $second->toDateTimeString();         // 2012-09-05 20:26:11
echo $second->tzName;               // America/Vancouver
 
var_dump($first->eq($second));           // bool(true)
var_dump($first->ne($second));           // bool(false)
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)
 
$first->setDateTime(2012, 1, 1, 0, 0, 0);
$second->setDateTime(2012, 1, 1, 0, 0, 0);     // Remember tz is &#39;America/Vancouver&#39;
 
var_dump($first->eq($second));           // bool(false)
var_dump($first->ne($second));           // bool(true)
var_dump($first->gt($second));           // bool(false)
var_dump($first->gte($second));          // bool(false)
var_dump($first->lt($second));           // bool(true)
var_dump($first->lte($second));          // bool(true)
로그인 후 복사

要判断一个日期是否介于两个日期之间,可以使用 between() 方法,第三个可选参数指定比较是否可以相等,默认为 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)
로그인 후 복사

此外还提供了一些辅助方法,你可以从它们的名字中明白其含义:

$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!
로그인 후 복사

diffForHumans

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

1、当比较的时间超过当前默认时间

  • 1天前

  • 5月前

2、当用将来的时间与当前默认时间比较

  • 1小时距现在

  • 5月距现在

3、当比较的值超过另一个值

  • 1小时前

  • 5月前

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

  • 1小时后

  • 5月后

你可以把第二个参数设置为 true 来删除“前”、“距现在”等修饰语:diffForHumans(Carbon $other, true)

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());       // 11月后
 
echo Carbon::now()->addSeconds(5)->diffForHumans();      // 5秒距现在
 
echo Carbon::now()->subDays(24)->diffForHumans();       // 3周前
echo Carbon::now()->subDays(24)->diffForHumans(null, true);  // 3周
로그인 후 복사

위 출력 결과는 실제로 Carbon 유형의 날짜 및 시간 객체입니다.

public function boot()
{
  \Carbon\Carbon::setLocale(&#39;zh&#39;);
}
로그인 후 복사
로그인 후 복사
문자열 유형의 날짜를 얻으려면 다음 코드를 사용할 수 있습니다.
$article->created_at->diffForHumans();
로그인 후 복사
로그인 후 복사

날짜 유형을 문자열로 변환 🎜🎜🎜🎜🎜위에서 언급했듯이 기본적으로 Carbon의 메서드는 날짜 및 시간 개체를 반환합니다. 객체이지만 __toString 매직 메소드 덕분에 echo를 사용하여 직접 결과를 출력할 수 있습니다. 하지만 문자열로 변환하려면 toDateString 또는 toDateTimeString 메서드를 사용할 수 있습니다. 🎜rrreee🎜🎜Date parsing🎜🎜🎜🎜 또한 구문 분석 메서드를 사용하여 날짜의 순서와 유형을 구문 분석할 수도 있습니다(결과는 Carbon 유형 datetime 객체 ): 🎜rrreee🎜🎜 날짜 구성 🎜🎜🎜🎜 별도의 연, 월, 일을 사용하여 날짜를 구성할 수도 있습니다. 🎜rrreee🎜 또한 유효한 시간대를 마지막 인수로 전달할 수 있습니다. 🎜🎜🎜날짜 연산🎜🎜🎜🎜날짜 연산은 더하거나 뺄 단위를 따라가기 위해 더하기(증가) 또는 빼기(빼기)를 통해 수행할 수 있습니다. 예를 들어, 날짜에 지정된 일수를 추가하려면 addDays 메소드를 사용할 수 있습니다. 또한 수정 방법이 제공됩니다. 매개변수 형식은 + 또는 - 뒤에 값과 단위가 옵니다. 따라서 현재 날짜에 1년을 추가하려면 +1년을 넘길 수 있습니다. 🎜rrreee🎜🎜날짜 비교🎜🎜🎜🎜Carbon에서는 다음 방법을 사용하여 날짜를 비교할 수 있습니다. 🎜
  • 🎜min – 최소 날짜를 반환합니다. 🎜
  • 🎜max – 최대 날짜를 반환합니다. 🎜
  • 🎜eq – 두 날짜가 같은지 확인합니다. 🎜
  • 🎜gt – 첫 번째 날짜가 두 번째 날짜보다 큰지 여부를 결정합니다. 🎜
  • 🎜lt – 첫 번째 날짜가 두 번째 날짜보다 작은지 여부를 결정합니다. 🎜
  • 🎜gte – 첫 번째 날짜가 두 번째 날짜보다 크거나 같은지 확인합니다. 🎜
  • 🎜lte – 첫 번째 날짜가 두 번째 날짜보다 작거나 같은지 확인합니다. 🎜
rrreee🎜 날짜가 두 날짜 사이에 있는지 확인하려면 between() 메서드를 사용할 수 있습니다. 세 번째 선택적 매개변수는 비교가 동일할 수 있는지 여부를 지정합니다. 🎜rrreee🎜 또한 몇 가지 도우미 메서드가 제공되며 이름에서 의미를 이해할 수 있습니다. 🎜rrreee🎜🎜diffForHumans🎜🎜🎜🎜 "1개월 전"이 "30일 전"보다 읽기 쉽습니다. 많은 날짜 라이브러리가 이 공통 함수를 제공합니다. 날짜가 구문 분석된 후에는 네 가지 가능성이 있습니다: 🎜🎜1. 비교된 시간이 현재 기본 시간을 초과하는 경우 🎜🎜
  • 🎜1일 전🎜
  • 🎜5개월 전🎜
🎜2. 미래 시간과 현재 기본 시간을 비교할 때🎜🎜
  • 🎜1시간 전 now🎜
  • 🎜5개월 후🎜
🎜3. 비교된 값이 다른 값을 초과하는 경우🎜🎜
  • 🎜1시간 전🎜
  • 🎜5개월 전🎜
🎜4. 비교된 값이 다른 값 뒤에 오는 경우🎜🎜
  • 🎜1시간 후🎜
  • 🎜5개월 후🎜
🎜 두 번째 매개변수를 true로 설정하면 "이전", "지금부터" 등을 삭제할 수 있습니다. 수정자: diffForHumans(Carbon $other, true) . 🎜rrreee🎜🎜🎜현지화🎜🎜🎜

可以在 app/Providers/AppServiceProvider.php 的 boot() 方法中添加下面的代码来设置全局本地化:

public function boot()
{
  \Carbon\Carbon::setLocale(&#39;zh&#39;);
}
로그인 후 복사
로그인 후 복사

设置好之后,在输出时间的地方调用:

$article->created_at->diffForHumans();
로그인 후 복사
로그인 후 복사

类似的格式即可。

更多 Carbon 操作,可查看文档。

위 내용은 Laravel의 날짜 및 시간 처리 패키지인 Carbon의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿