Child pages
  • PHP Carbon 라이브러리로 날짜/시간 처리하기

Contents



카본PHP 의 DateTime 클래스를 확장하여 날자와 시간을 쉽게 다룰수 있는 라이브러리입니다.


Carbon Instance 생성

현재 시간 객체 생성

now() static 메서드를 사용하여 현재 시간을 갖는 객체 생성

// $dt 는 현재 시간이 저장됨


$dt = \Carbon\Carbon::now();


문자열에서 생성

날짜/시간 문자열에서 Carbon 객체 생성

$val = '2015-10-11 11:22:33';
$dt = \Carbon\Carbon::createFromFormat('Y-m-d h:i:s', $val);


24시간을 사용하려면 포맷에 'h' 대신 'H' 지정

$val = '2015-10-11 14:22:33';
$dt = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $val);

DateTime 에서 생성

PHP의 DateTime 객체로부터 생성하려면 instance() 메소드 사용

$php_dt = new DateTime('2011-01-01T15:03:01.012345Z');


$this_update = \Carbon\Carbon::instance($php_dt );


라라벨 엘로퀀트 연동

laravel 은 Model 클래스의 $dates 변수에 날자/시간 컬럼을 명시하면 자동으로 Carbon 객체로 생성됩니다.

class Task extends Model {
	protected $dates = ['deleted_at', 'requested_at'];
}


$dates 에 안 넣고 view 에 전달하면 mutator/accessor 가 안 되므로 다음 에러 발생. 


날자 계산

addXXX

시간 및 날자 더하기는 addXXX 메서드 사용하며 XXX 가 단수형일 경우 파라미터가 없고 1을 더하며 복수형을 경우 더할 숫자를 전달해 주면 된다.

  • 1시간을 더할 경우 addHour()
  • 3시간을 더할 경우 addHours(3)
  • 1시간을 더하는 addHour()addHours(1) 와 동일
use Carbon\Carbon;

// 현재 시간 
$dt = Carbon::now();

// 1분 더하기
$dt->addMinute();


// 현재 시간보다 5시간 37분 이후
$dt->addHours(5)->addMinutes(37);

// 하루 더하기
$dt->addDay();

// 현재 일보다 3주 5일 뒤
$dt->addWeeks(3)->addDays(3);


// 현재 일보다 2달 5일 뒤
$dt->addMonths(2)->addDays(3);

subXXX

뺄 경우 subXXX 를 사용하며 또는 addXXX 에서 파라미터를 - 로 줘도 된다.

use Carbon\Carbon;

// 현재 시간 
$dt = Carbon::now();
  
// 3시간 28분전
$dt->subHours(3)->subMinutes(28); 
 
// 60 개월 4일 전
$dt->subMonths(60)->subDays(4);

날자 계산 함수를 쓰면 현재 인스턴스를 변경하므로 원하지 않을 경우 $dt->copy()->subDays() 처럼 copy() 로 인스턴스를 복제후 사용.


차이 계산

use \Carbon\Carbon;


$dt = Carbon::now();
 
$dt->diffInDays($dt->copy()->addMonth());     // 1달 후이므로 차이는 30
        
 
echo Carbon::now()->subDays(5)->diffForHumans();              // 5 days ago


출력

기본 출력

toXXXString() 메서드를 사용하면 되며 XXX 는 출력할 데이타 명을 사용

  • 날자와 시간을 출력할 때: toDateTimeString() 
  • 날자 출력: toDateString()
  • 시간 출력: toTimeString()
$dt = Carbon::create(1975, 12, 25, 14, 15, 16);

var_dump($dt->toDateTimeString() == $dt);          // bool(true) => uses __toString()
echo $dt->toDateString();                          // 1975-12-25
echo $dt->toFormattedDateString();                 // Dec 25, 1975
echo $dt->toTimeString();                          // 14:15:16
echo $dt->toDateTimeString();                      // 1975-12-25 14:15:16
echo $dt->toDayDateTimeString();                   // Thu, Dec 25, 1975 2:15 PM
$dt = \Carbon\Carbon::now();
 
echo $dt;  // 2016-04-26 14:28:39
echo $dt->toDateTimeString();  // 상동
 
echo $dt->toDateString();  // 2016-04-26
echo $dt->toTimeString();  // 14:28:39


출력 포맷팅

setToStringFormat($format) 메소드 사용하며 파라미터로 출력할 포맷을 지정. 기본 포맷팅으로 돌릴 경우 resetToStringFormat() 메서드 사용

$dt = \Carbon\Carbon::now();
 
$dt->setToStringFormat('jS \o\f F, Y g:i:s a');
echo $dt;                                          // 26th of April, 2016 02:28:39 pm
 
$dt->setToStringFormat('Y-m-d H:i:s');
echo $dt;										  //  2016-04-26 14:28:39
$dt->resetToStringFormat();
echo $dt;                                          //  2016-04-26 14:28:39


Modifiers

시간을 변경할 수 있는  startOfXXX(), next() and previous()  등의 메서드

startOfXXX

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfDay();                            // 2012-01-31 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfDay();                              // 2012-01-31 23:59:59

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfMonth();                          // 2012-01-01 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfMonth();                            // 2012-01-31 23:59:59

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfYear();                           // 2012-01-01 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfYear();                             // 2012-12-31 23:59:59


next, previous

$dt = Carbon::create(2012, 1, 1, 12, 0, 0);
echo $dt->previous();                              // 2011-12-25 00:00:00


$dt = Carbon::create(2012, 1, 1, 12, 0, 0);
echo $dt->next();                                  // 2012-01-08 00:00:00


average

$start = Carbon::create(2014, 1, 1, 0, 0, 0);
$end = Carbon::create(2014, 1, 30, 0, 0, 0);
echo $start->average($end);                        // 2014-01-15 12:00:00


Constant

dayOfWeek

현재 Carbon 객체의 요일을 확인하려면 dayOfWeek 변수를 아래의 constant 와 비교하면 됨,.

var_dump(Carbon::SUNDAY);                          // int(0)
var_dump(Carbon::MONDAY);                          // int(1)
var_dump(Carbon::TUESDAY);                         // int(2)
var_dump(Carbon::WEDNESDAY);                       // int(3)
var_dump(Carbon::THURSDAY);                        // int(4)
var_dump(Carbon::FRIDAY);                          // int(5)
var_dump(Carbon::SATURDAY);                        // int(6)
$dt = \Carbon\Carbon::create(2017, 12, 25, 0, 0, 0);


echo $dt->dayOfWeek;	// 1 이므로 17년 크리스마스는 월요일


주말인지 확인

위 constant 를 응용해서 토/일요일인지 확인 가능

<?php

$dates = ["2017-08-18" => false, "2017-08-19" => true, "2017-08-20" => true, "2017-08-21" => false, ];

foreach($dates as $d => $v) {
    $dt = \Carbon\Carbon::createFromFormat('Y-m-d', $d);

    if ($dt->dayOfWeek == \Carbon\Carbon::SUNDAY || $dt->dayOfWeek == \Carbon\Carbon::SATURDAY)
	    echo "$d 는 주말입니다.\n";
    else 
	    echo "$d 는 평일이니 열심히 일하세요.!\n";    
}


기타 Constant

var_dump(Carbon::YEARS_PER_CENTURY);               // int(100)
var_dump(Carbon::YEARS_PER_DECADE);                // int(10)
var_dump(Carbon::MONTHS_PER_YEAR);                 // int(12)
var_dump(Carbon::WEEKS_PER_YEAR);                  // int(52)
var_dump(Carbon::DAYS_PER_WEEK);                   // int(7)
var_dump(Carbon::HOURS_PER_DAY);                   // int(24)
var_dump(Carbon::MINUTES_PER_HOUR);                // int(60)
var_dump(Carbon::SECONDS_PER_MINUTE);              // int(60)


CarbonInterval

PHP 의 dateinterval 을 상속한 유틸리티 클래스


make() 메서드로 문자열로부터 Instance 생성 가능

echo CarbonInterval::make('1h 15m')->forHumans();            // 1 hour 15 minutes


같이 보기

This page has no comments.