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
같이 보기
- Carbon 기반의 다개국어로 date 를 표시할 수 있는 패키지 - https://github.com/jenssegers/date
- PHP에서 DateTime Class 사용하기 - haruair
This page has no comments.