Kudos
Collect
Twiiter
Facebook
Share
모든 언어를 품어가는 PHP 의 매력에 빠져 있는 PHPer 입니다. PHP 를 사용하면서 알게된 Tip 을 공유해 나가겠습니다.

DateTime 클래스 메모

마지막 업데이트 4년 전
0 0 0 1

이 글은 @re-24 의 글 DateTime クラスのまとめメモ 의 한국어 번역 입니다.

글머리

PHP에서 날짜에 관련해서 찾아보면 매뉴얼과 같은 글이 상위에 검색되기 때문에 딱딱아지 않은 글이 있어도 좋을 법 해서, DateTime 클래스를 이용한 날짜관련 사용법을 개인적인 메모로 정리해 보았다.

예제

현재시간 생성하기

$date = new DateTime();
echo $date->format('Y-m-d H:i:s'); // 2014-08-06 21:15:49

임의의 시간 생성하기

// 문자열로부터
$date = new DateTime('2014-08-01 23:01:05');
echo $date->format('Y-m-d H:i:s'); // 2014-08-01 23:01:05

// 숫자로부터
$date = new DateTime();
$date->setDate(2014, 8, 1);
echo $date->format('Y-m-d H:i:s'); // 2014-08-01 21:04:25

$date = new DateTime();
$date->setDate(2014,8,1)->setTime(1,10,13);
echo $date->format('Y-m-d H:i:s'); // 2014-08-01 01:10:13

임의의 날짜를 생성하기 (두번째)

날짜를 문자열로 입력해도 인스턴스는 생성되지만,
yyyy-mm-ddyyyy/mm/dd 는 ⭕️
yyyy년 mm월 dd일 은 ❌
처럼, 정해진 양식으로 입력하지 않으면 안된다.

플렉시블한 문자열로 날짜를 지정하고 싶을때는 이쪽을 사용.

$format = 'Y년 m월 d일 H시 i분 s초';
$date = DateTime::createFromFormat($format, '2014년 02월 05일 23시 11분 24초');
echo $date->format('Y-m-d H:i:s');

timezone 확인 및 설정

$date = new DateTime();
$timezone = $date->getTimezone();
echo $timezone->getName();            // 현재 timezone: Asia/Seoul
echo $date->format('Y-m-d H:i:s');    // 2014-08-06 21:09:59

// timezone 변경
$date->setTimezone(new DateTimeZone('Europe/London'));
echo $date->format('Y-m-d H:i:s');    // 2014-08-06 13:09:59

// 처음부터 timezone 을 설정하기
$date = new DateTime(null,new DateTimeZone('Europe/London'));
echo $date->format('Y-m-d H:i:s');    // 2014-08-06 13:09:59

여러가지 출력형식

자세한 사항은 format 매개변수Inherited constants 값 참조

$date = new DateTime();
echo $date->format('Y-m-d h:i:s a'); // 2014-08-06 9:23:46 pm
echo $date->format('y-F-d D');       // 14-August-06 Wed
echo $date->format('t');             // 31

// Inherited constants 값
echo $date->format(DateTime::ATOM);  // 2014-08-06T21:28:50+09:00
echo $date->format(DateTime::COOKIE);// Wednesday, 06-Aug-14 21:28:50 KST
echo $date->format(DateTime::RSS);   // Wed, 06 Aug 2014 21:28:50 +0900
echo $date->format(DateTime::W3C);   // 2014-08-06T21:28:50+09:00

날짜 더하기, 빼기 및 상대적 시간 구하기

modify 에서 인식할 수 있는 서식은, Supported Date and Time Formats 을 참고

$date = new DateTime('2014-08-05');
echo $date->modify('+1 days')->format('Y-m-d H:i:s'); // 1일 후

$date = new DateTime('2014-08-05');
echo $date->modify('-1 days')->format('Y-m-d H:i:s'); // 1일 전

// 그 밖의 설정
$date->modify('+6 hours');                     // 6시간 후
$date->modify('+1 weeks');                     // 1주일 후
$date->modify('+1 months + 2 days + 3 hours'); // 1개월 2일 3시간 후
$date->modify('noon');                         // 정오
$date->modify('first day of this months');     // 이번달 1일
$date->modify('last day of this months');      // 이벌달 말일
$date->modify('first day of next months');     // 다음달 1일
$date->modify('first day of last months');     // 전달 1일
$date->modify('sunday');                       // 다음 일요일
$date->modify('monday this week');             // 이번주 월요일
$date->modify('third sunday of this months')   // 이번달의 3번째 일요일

날짜의 차이를 계산하기

반환값으로 DateInterval 형을 리턴

$date1 = new DateTIme('2014-05-04');
$date2 = new DateTime('2014-05-07');
$diff = $date1->diff($date2);
echo $diff->format('%R%a');                        // +3
echo $date2->diff($date1)->format('%R%a');         // -3
echo $date2->diff($date1, true)->format('%R%a');   // +3 (항상 양의 값)

$date1 = new DateTime('2013-05-04 23:34:14');
$date2 = new DateTime('2014-07-01 10:11:13');
$diff = $date1->diff($date2);
echo $diff->format('%R %y년 %m개월 %d일 %h시간 %i분 %s초 차이');
// + 1년 1개월 26일 10시간 36분 59초 차이

timestamp 구하기

$date = new DateTime();
echo $date->getTimestamp();

getTimestamp 의 버그

DateTime::getTimestamp() 를 실행하면 날짜가 변하는 문제
에 의하면, modify 한 후 getTimesamp 을 실행하면 의도하지 않게 날짜가 변하는 경우가 있다고 합니다.
그럴때는 format('U') 를 사용해서 타임스탬프를 구하면 괜찮은것 같네요.

$date = new DateTime('2014/01/01 00:00:00');
$date->modify('first day of -1 second');
var_dump($date->format('Y-m-d H:i:s'));

//var_dump($date->getTimestamp()); ← 이렇게 하면 날짜가 변함
var_dump($date->format('U'));   // ← 이렇게 하면 날짜가 변하지 않음

var_dump($date->format('Y-m-d H:i:s')); 

DateTime 와 DateTimeImmutable

DateTimeImmutable - PHP 공식 사이트

이 클래스의 움직임은 DateTime 하고 거의 같지만, 자기 자신을 업데이트 하지 않고 새로운 오브젝트를 돌려준다는 점이 다릅니다.

PHP5.5 이상 버젼이 사용하능하면 이쪽을 사용 하는게 좋을 듯 합니다.
(저의환경은 5.4라 테스트 하지는 못했습니다.)

$date = new DateTIme();
$date->modify('+1 days');
echo $date->format('Y-m-d H:i:s');

$date = new DateTimeImmutable();
$tommorow = $date->modify('+1 days');
echo $tommorow->format('Y-m-d H:i:s');

사족

틀린점이라던가 더 좋은 방법이라던가가 있으면 언제든 알려주세요~ m(_ _)m

Essedrop - 이미지 주소를 만드는 가장 빠른 방법
 

독자 의견

  • 정리해주신 글 덕분에 날짜 표현 잘 했습니다^^ 감사합니다~

저자 @phper 에게 의견 남기기:

Please sign in to comment.
Markdown is also available in comment.