> 백엔드 개발 > PHP 튜토리얼 > PHP에서 시간 처리 클래스 Carbon의 사용법에 대한 자세한 소개

PHP에서 시간 처리 클래스 Carbon의 사용법에 대한 자세한 소개

WBOY
풀어 주다: 2023-04-11 07:18:01
앞으로
5286명이 탐색했습니다.

이 글은 주로 PHP에 대한 관련 지식을 소개합니다. Carbon은 PHP의 Datetime 클래스를 상속받은 PHP의 날짜 처리 라이브러리(DateTime용 간단한 PHP API 확장)입니다. 모두를 돕습니다.

PHP에서 시간 처리 클래스 Carbon의 사용법에 대한 자세한 소개

(추천 튜토리얼: PHP 비디오 튜토리얼)

1. 소개

Carbon은 PHP용 날짜 처리 라이브러리입니다(DateTime용 간단한 PHP API 확장).

Carbon은 PHP의 Datetime 클래스를 상속받기 때문에 Carbon에 포함되지 않지만 Datetime에 구현된 모든 메소드를 사용할 수 있습니다.

코드를 보세요

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

Carbon 클래스는 Carbon 네임스페이스 아래에 선언되어 있습니다. 매번 전체 클래스 이름을 입력하는 대신 네임스페이스를 도입할 수 있습니다.

<?php
use Carbon\Carbon;
로그인 후 복사

참고: Carbon 사용 시 특별히 시간대를 설정하지 않으면 기본적으로 America/Toronto 시간대가 사용됩니다.

올바른 시간대가 사용되는지 특히 주의하세요. 예를 들어 Carbon의 모든 차이 비교는 UTC 또는 시스템에서 설정한 시간대를 사용합니다.

<?php
$dtToronto = Carbon::createFromDate(2012, 1, 1, &#39;America/Toronto&#39;);
$dtVancouver = Carbon::createFromDate(2012, 1, 1, &#39;America/Vancouver&#39;);
 
echo $dtVancouver->diffInHours($dtToronto); // 3
로그인 후 복사

위의 시간 비교는 제공된 Carbon 인스턴스의 시간대를 기준으로 이루어졌습니다. 예를 들어, 작성자의 시간대는 도쿄 시간에서 13시간을 뺀 시간이므로 오후 1시 이후입니다. Carbon::now('Asia/Tokyo')->isToday()는 false를 반환합니다. now()를 호출할 때 시간대가 도쿄 시간대로 설정된 경우 후속 작업에 도쿄 시간대를 사용하는 것은 무리입니다. 따라서 now()로 생성된 인스턴스와 비교할 때 기본값은 현재 시간대에서 수행됩니다.

2.인스턴스화

Carbon의 인스턴스를 생성하는 방법은 여러 가지가 있지만 누구나 이 의미론적 정적 방법을 통해 인스턴스를 구현하는 것을 선호해야 합니다.

<?php
$carbon = new Carbon();                  // equivalent to Carbon::now()
$carbon = new Carbon(&#39;first day of January 2008&#39;, &#39;America/Vancouver&#39;);
echo get_class($carbon);                 // &#39;Carbon\Carbon&#39;
$carbon = Carbon::now(-5);
로그인 후 복사

Carbon 생성자의 두 번째 매개변수가 DateTimeZone 인스턴스일 뿐만 아니라 문자열 또는 정수(GMT에 상대적인 오프셋 값을 나타냄)로 향상되었다는 점은 주목할 가치가 있습니다. now() 메소드를 설명하기 위해 예를 들어보겠습니다.

<?php
$now = Carbon::now();
 
$nowInLondonTz = Carbon::now(new DateTimeZone(&#39;Europe/London&#39;));
 
// or just pass the timezone as a string
$nowInLondonTz = Carbon::now(&#39;Europe/London&#39;);
 
// or to create a date with a timezone of +1 to GMT during DST then just pass an integer
echo Carbon::now(1)->tzName;             // Europe/London
로그인 후 복사

원래의 번거로운 구성 방법을 대체하기 위해pars() 메서드를 사용하고 싶을 것입니다

<?php
echo (new Carbon(&#39;first day of December 2008&#39;))->addWeeks(2);     // 2008-12-15 00:00:00
echo Carbon::parse(&#39;first day of December 2008&#39;)->addWeeks(2);    // 2008-12-15 00:00:00
로그인 후 복사

now()와 유사하며 Carbon 인스턴스를 직접 반환하는 메서드에는 today(), Tomorrow(), 어제()가 포함됩니다. 시간대 유형 매개변수를 허용하고 최종 결과의 시간 부분은 00:00:00

<?php
$now = Carbon::now();
echo $now;                               // 2016-06-24 15:18:34
$today = Carbon::today();
echo $today;                             // 2016-06-24 00:00:00
$tomorrow = Carbon::tomorrow(&#39;Europe/London&#39;);
echo $tomorrow;                          // 2016-06-25 00:00:00
$yesterday = Carbon::yesterday();
echo $yesterday;                         // 2016-06-23 00:00:00
로그인 후 복사

입니다. 다음은 creatXXX() 형식의 다른 정적 메서드입니다. 대부분의 정적 메소드의 매개변수는 전달될 수 있으며 전달되지 않을 경우 해당 메소드에 미리 설정된 기본값이 사용됩니다. 이러한 미리 설정된 값은 일반적으로 현재 날짜, 시간 및 시간대를 기준으로 합니다. 필수 매개변수가 전달되지 않으면 InvalidArgumentException 유형의 예외가 발생합니다. 예외의 세부사항을 가져오려면 DateTime::getLastErrors() 메소드를 사용하십시오.

<?php
Carbon::createFromDate($year, $month, $day, $tz);
Carbon::createFromTime($hour, $minute, $second, $tz);
Carbon::create($year, $month, $day, $hour, $minute, $second, $tz);
로그인 후 복사

createFromDate()는 기본적으로 현재 시간을 반환하고, createFromTime() 날짜는 기본적으로 오늘로 설정됩니다. crete()의 모든 null 매개변수는 현재 해당 시간으로 기본 설정됩니다. 마찬가지로 시간대는 기본적으로 현재 시간대로 설정됩니다. 시간만 설정하고 분과 초는 설정하지 않은 경우 분과 초는 기본적으로 0

<?php
$xmasThisYear = Carbon::createFromDate(null, 12, 25);  // Year defaults to current year
$Y2K = Carbon::create(2000, 1, 1, 0, 0, 0);
$alsoY2K = Carbon::create(1999, 12, 31, 24);
$noonLondonTz = Carbon::createFromTime(12, 0, 0, &#39;Europe/London&#39;);
 
// A two digit minute could not be found
try { 
    Carbon::create(1975, 5, 21, 22, -2, 0); 
} catch(InvalidArgumentException $x) { 
    echo $x->getMessage(); 
}
로그인 후 복사
<?php
Carbon::createFromFormat($format, $time, $tz);
로그인 후 복사

createFromFormat() 및 PHP의 DateTime::createFromFormat으로 설정됩니다. 차이점은 $dt 매개변수가 DateTImeZone의 인스턴스이거나 시간대 문자열일 수 있다는 것입니다. 그리고 매개변수 예외 프롬프트를 반환할 수도 있습니다. createXX()의 소스 코드에서 모두 createFromFormat() 메서드를 호출하는 것을 볼 수 있습니다.

<?php
echo Carbon::createFromFormat(&#39;Y-m-d H&#39;, &#39;1975-05-21 22&#39;)->toDateTimeString(); // 1975-05-21 22:00:00
로그인 후 복사

언급된 마지막 두 가지 생성 방법은 둘 다 Unix 타임스탬프를 처리합니다. 첫 번째는 예상 타임스탬프와 동일한 Carbon 인스턴스를 반환하며, 시간대를 설정하거나 기본값을 선택할 수 있습니다. 두 번째 방법인 createFromTimestampUTC()는 시간대가 항상 UTC(GMT)라는 점에서 첫 번째 방법과 다릅니다. 첫 번째 방법의 두 번째 예는 이 함수의 사용법을 더 명확하게 하기 위한 것입니다. 음수 타임스탬프도 허용됩니다.

<?php
echo Carbon::createFromTimestamp(-1)->toDateTimeString();                        // 1969-12-31 18:59:59
echo Carbon::createFromTimestamp(-1, &#39;Europe/London&#39;)->toDateTimeString();       // 1970-01-01 00:59:59
echo Carbon::createFromTimeStampUTC(-1)->toDateTimeString();                     // 1969-12-31 23:59:59
로그인 후 복사

copy() 메서드는 기존 Carbon 인스턴스를 복사할 수 있습니다. 복사본으로 생성된 인스턴스를 수정해도 복사된 개체 자체에는 영향을 주지 않습니다.

<?php
$dt = Carbon::now();
echo $dt->diffInYears($dt->copy()->addYear());  // 1
 
// $dt was unchanged and still holds the value of Carbon:now()
로그인 후 복사

마지막으로, 이를 확장하는 다른 DateTime 라이브러리를 인스턴스화하여 얻은 DateTime 인스턴스를 사용하는 경우 두려워하지 마세요! Carbon 인스턴스는 다음 방법을 통해 여전히 매우 친숙하게 생성될 수 있습니다.

<?php
$dt = new \DateTime(&#39;first day of January 2008&#39;); // <== instance from another API
$carbon = Carbon::instance($dt);
echo get_class($carbon);                               // &#39;Carbon\Carbon&#39;
echo $carbon->toDateTimeString();                      // 2008-01-01 00:00:00
로그인 후 복사

밀리초를 일부 처리합니다. PHP와 함께 제공되는 DateTime 클래스도 밀리초를 설정할 수 있지만 날짜를 수학적 추정할 때 밀리초는 고려되지 않습니다. Carbon 버전 1.12.0부터 인스턴스화 및 복사는 format() 메서드와 같이 밀리초를 지원할 수도 있습니다(기본적으로 PHP의 Datetime::format()만 밀리초를 지원합니다).

<?php
$dt = Carbon::parse(&#39;1975-05-21 22:23:00.123456&#39;);
echo $dt->micro;                                       // 123456
echo $dt->copy()->micro;                               // 123456
로그인 후 복사

PHP에서 지원하는 유효한 시간 값 범위 가져오기: 가장 이른 시간, 가장 늦은 시간

<?php
echo Carbon::maxValue();                               // &#39;2038-01-18 22:14:07&#39;
echo Carbon::minValue();                               // &#39;1901-12-13 15:45:52&#39;
로그인 후 복사

3.Localization

Carbon에서 formatLocalized() 메서드는 PHP의 기본 DateTime 클래스가 이를 지원하지 않는다는 사실을 보완합니다. 지역화 설정의 함정. setlocale() 메서드를 사용하여 현재 로캘을 설정한 경우 formatLocalized($format) 메서드는 설정된 로캘 형식을 반환합니다.

<?php
setlocale(LC_TIME, &#39;German&#39;);
echo $dt->formatLocalized(&#39;%A %d %B %Y&#39;);          // Mittwoch 21 Mai 1975
setlocale(LC_TIME, &#39;&#39;);
echo $dt->formatLocalized(&#39;%A %d %B %Y&#39;);          // Wednesday 21 May 1975
로그인 후 복사

diffForHumans() 결과도 지역 언어로 변환됩니다. Carbon의 지역 언어는 Carbon::setLocale() 메소드를 통해 설정할 수 있습니다.

<?php
Carbon::setLocale(&#39;de&#39;);
echo Carbon::now()->addYear()->diffForHumans();    // in 1 Jahr
 
Carbon::setLocale(&#39;en&#39;);
로그인 후 복사

注意:如果在linux系统中转换出现了问题,请仔细检查安装在本地或生产系统中语言环境

locale -a 列举出所有可用的语言环境

sudo locale-gen zh_CN.utf8 安装新的语言环境

sudo dpkg-reconfigure locales 配置启用新的语言环境,并重启

4.Testing Aids()

通过测试方法可以得到一个模拟或真实的 Carbon 实例。只有在以下情况下,主动提供的 Carbon 实例才会被特殊处理:

  • 调用静态方法 now(),例如:Carbon::now()
  • 传给 construct 或 parse() 方法的是 null (或空字符串),例如:new Carbon(null)
  • 当传给 construct 或 parse()的是字符串 now,例如:new Carbon(‘now’)
$knownDate = Carbon::create(2001, 5, 21, 12);          // create testing date
Carbon::setTestNow($knownDate);                        // set the mock (of course this could be a real mock object)
echo Carbon::now();                                    // 2001-05-21 12:00:00
echo new Carbon();                                     // 2001-05-21 12:00:00
echo Carbon::parse();                                  // 2001-05-21 12:00:00
echo new Carbon(&#39;now&#39;);                                // 2001-05-21 12:00:00
echo Carbon::parse(&#39;now&#39;);                             // 2001-05-21 12:00:00
var_dump(Carbon::hasTestNow());                        // bool(true)
Carbon::setTestNow();                                  // clear the mock
var_dump(Carbon::hasTestNow());                        // bool(false)
echo Carbon::now();
로그인 후 복사

有用的例子:

class SeasonalProduct
{
    protected $price;
 
    public function __construct($price)
{
        $this->price = $price;
    }
 
    public function getPrice() {
        $multiplier = 1;
        if (Carbon::now()->month == 12) {
            $multiplier = 2;
        }
 
        return $this->price * $multiplier;
    }
}
 
$product = new SeasonalProduct(100);
Carbon::setTestNow(Carbon::parse(&#39;first day of March 2000&#39;));
echo $product->getPrice();                                             // 100
Carbon::setTestNow(Carbon::parse(&#39;first day of December 2000&#39;));
echo $product->getPrice();                                             // 200
Carbon::setTestNow(Carbon::parse(&#39;first day of May 2000&#39;));
echo $product->getPrice();                                             // 100
Carbon::setTestNow();
로그인 후 복사

一些相关的用法也可以得到一个模拟的 now 实例,返回相应的模拟数据。

$knownDate = Carbon::create(2001, 5, 21, 12);          // create testing date
Carbon::setTestNow($knownDate);                        // set the mock
echo new Carbon(&#39;tomorrow&#39;);                           // 2001-05-22 00:00:00  ... notice the time !
echo new Carbon(&#39;yesterday&#39;);                          // 2001-05-20 00:00:00
echo new Carbon(&#39;next wednesday&#39;);                     // 2001-05-23 00:00:00
echo new Carbon(&#39;last friday&#39;);                        // 2001-05-18 00:00:00
echo new Carbon(&#39;this thursday&#39;);                      // 2001-05-24 00:00:00
Carbon::setTestNow();
로그인 후 복사

以下是当前支持的时间转换字

  • this
  • last
  • next
  • tomorrow
  • yesterday
  • +
  • -
  • first
  • ago

值得注意的是像 next() , previous() 和 modify() 方法等相关的修改会把日期的时间部分设置成 00:00:00 。

5.Getters

获取器通过PHP的 __get() 方式实现。可以直接通过一下方式直接获取到属性的值。

$dt = Carbon::parse(&#39;2012-9-5 23:26:11.123789&#39;);
 
// These getters specifically return integers, ie intval()
var_dump($dt->year);                                         // int(2012)
var_dump($dt->month);                                        // int(9)
var_dump($dt->day);                                          // int(5)
var_dump($dt->hour);                                         // int(23)
var_dump($dt->minute);                                       // int(26)
var_dump($dt->second);                                       // int(11)
var_dump($dt->micro);                                        // int(123789)
var_dump($dt->dayOfWeek);                                    // int(3)
var_dump($dt->dayOfYear);                                    // int(248)
var_dump($dt->weekOfMonth);                                  // int(1)
var_dump($dt->weekOfYear);                                   // int(36)
var_dump($dt->daysInMonth);                                  // int(30)
var_dump($dt->timestamp);                                    // int(1346901971)
var_dump(Carbon::createFromDate(1975, 5, 21)->age);          // int(41) calculated vs now in the same tz
var_dump($dt->quarter);                                      // int(3)
 
// Returns an int of seconds difference from UTC (+/- sign included)
var_dump(Carbon::createFromTimestampUTC(0)->offset);         // int(0)
var_dump(Carbon::createFromTimestamp(0)->offset);            // int(-18000)
 
// Returns an int of hours difference from UTC (+/- sign included)
var_dump(Carbon::createFromTimestamp(0)->offsetHours);       // int(-5)
 
// Indicates if day light savings time is on
var_dump(Carbon::createFromDate(2012, 1, 1)->dst);           // bool(false)
var_dump(Carbon::createFromDate(2012, 9, 1)->dst);           // bool(true)
 
// Indicates if the instance is in the same timezone as the local timezone
var_dump(Carbon::now()->local);                              // bool(true)
var_dump(Carbon::now(&#39;America/Vancouver&#39;)->local);           // bool(false)
 
// Indicates if the instance is in the UTC timezone
var_dump(Carbon::now()->utc);                                // bool(false)
var_dump(Carbon::now(&#39;Europe/London&#39;)->utc);                 // bool(false)
var_dump(Carbon::createFromTimestampUTC(0)->utc);            // bool(true)
 
// Gets the DateTimeZone instance
echo get_class(Carbon::now()->timezone);                     // DateTimeZone
echo get_class(Carbon::now()->tz);                           // DateTimeZone
 
// Gets the DateTimeZone instance name, shortcut for ->timezone->getName()
echo Carbon::now()->timezoneName;                            // America/Toronto
echo Carbon::now()->tzName;                                  // America/Toronto
로그인 후 복사

6.Setters

Setters 通过PHP的 __set() 方法实现。值得注意的是,通过这种方式设置时间戳时,时区不会相对于时间戳而改变。如果需要改变时区的话,需要针对时区单独设置。

$dt = Carbon::now();
 
$dt->year = 1975;
$dt->month = 13;             // would force year++ and month = 1
$dt->month = 5;
$dt->day = 21;
$dt->hour = 22;
$dt->minute = 32;
$dt->second = 5;
 
$dt->timestamp = 169957925;  // This will not change the timezone
 
// Set the timezone via DateTimeZone instance or string
$dt->timezone = new DateTimeZone(&#39;Europe/London&#39;);
$dt->timezone = &#39;Europe/London&#39;;
$dt->tz = &#39;Europe/London&#39;;
로그인 후 복사

7.Fluent Setters

此处 Setters 方法的参数是必选参数,Carbon 提供了更多种设置方式可供使用。值得注意的是,所有对于时区的修改都会影响整个到 Carbon 实例。对时间戳进行修改时不会自动转换到时间戳对应的时区。

$dt = Carbon::now();
 
$dt->year(1975)->month(5)->day(21)->hour(22)->minute(32)->second(5)->toDateTimeString();
$dt->setDate(1975, 5, 21)->setTime(22, 32, 5)->toDateTimeString();
$dt->setDateTime(1975, 5, 21, 22, 32, 5)->toDateTimeString();
 
$dt->timestamp(169957925)->timezone(&#39;Europe/London&#39;);
 
$dt->tz(&#39;America/Toronto&#39;)->setTimezone(&#39;America/Vancouver&#39;);
로그인 후 복사

8.IsSet

当尝试调用 Carbon 实例的属性时,会首先检查该属性是否存在,存在返回 true,不存在返回 false。

var_dump(isset(Carbon::now()->iDoNotExist));       // bool(false)
var_dump(isset(Carbon::now()->hour));              // bool(true)
var_dump(empty(Carbon::now()->iDoNotExist));       // bool(true)
var_dump(empty(Carbon::now()->year));              // bool(false)
로그인 후 복사

(推荐教程:PHP视频教程

위 내용은 PHP에서 시간 처리 클래스 Carbon의 사용법에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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