Programming/PHP

[PHP] #32 PHP DateTime 클래스 완전 정복: 날짜 계산, 차이, 포맷 변경까지

TOASTDEV 2025. 9. 5. 17:00
반응형

 

 

안녕하세요 토스트데브입니다.
앞서 date()와 strtotime() 등의 기본 날짜/시간 함수들을 배웠다면, 이번 글에서는 더 강력하고 유연한 DateTime 클래스를 사용한 날짜 처리 방법을 알아보겠습니다.

DateTime은 PHP 5.2 이후부터 도입된 객체 지향 기반 날짜/시간 처리 클래스로, 날짜 비교, 차이 계산, 시간 조정, 포맷 변환 등을 더 직관적이고 강력하게 할 수 있습니다.

 

 

🕓 DateTime 객체 생성

✅ 현재 시각 기준 객체 생성

$now = new DateTime();
echo $now->format('Y-m-d H:i:s');
// 예: 2025-09-02 15:00:00

 

✅ 특정 날짜로 생성

$date = new DateTime('2025-12-25');
echo $date->format('Y-m-d');
// 출력: 2025-12-25

 

 

🌍 시간대 설정

✅ 타임존을 지정한 DateTime 객체

$seoul = new DateTime("now", new DateTimeZone("Asia/Seoul"));
echo $seoul->format('Y-m-d H:i:s');

다양한 타임존 ID는 DateTimeZone::listIdentifiers()로 확인 가능

 

 

➕ 날짜 더하기 / 빼기

✅ add() / sub() + DateInterval

$dt = new DateTime('2025-01-01');
$dt->add(new DateInterval('P10D'));  // 10일 더하기
echo $dt->format('Y-m-d');           // 2025-01-11

$dt->sub(new DateInterval('P1M'));   // 1달 빼기
echo $dt->format('Y-m-d');           // 2024-12-11

P는 Period의 약자, ISO 8601 형식
예:

 

  • P1D : 1일
  • P2M : 2달
  • P3Y : 3년
  • P1Y2M10D : 1년 2달 10일

 

 

🔁 날짜 차이 계산

✅ diff() – 두 날짜 간 차이 구하기

$start = new DateTime('2025-01-01');
$end = new DateTime('2025-12-31');

$interval = $start->diff($end);
echo $interval->format('%m개월 %d일');  // 출력: 11개월 30일

 

결과는 DateInterval 객체로 반환되며, %y, %m, %d 등으로 포맷 가능

 

 

📆 반복 날짜 – DatePeriod

✅ 주차 반복, 월별 반복 등 일정 패턴 생성

$start = new DateTime('2025-09-01');
$end   = new DateTime('2025-10-01');
$interval = new DateInterval('P1W');

$period = new DatePeriod($start, $interval, $end);

foreach ($period as $date) {
    echo $date->format('Y-m-d') . "\n";
}
// 출력: 2025-09-01, 2025-09-08, ...

DatePeriod는 일정한 주기마다 반복되는 날짜 리스트 생성에 유용

 

 

💡 실전 팁

  • DateTime은 불변(immutable) 객체가 아님 → add()나 sub() 시 원본이 변경됨
    → 변경 없이 새 인스턴스를 원한다면 DateTimeImmutable 사용
  • diff()로 비교할 때 두 날짜의 순서에 따라 결과 부호가 달라질 수 있음
  • DateInterval의 기간 포맷은 ISO 8601 형식만 가능 (예: P1Y2M10D)

 

 

✅ 마무리

DateTime, DateInterval, DatePeriod를 활용하면 단순 날짜 출력뿐만 아니라, 복잡한 날짜 계산, 기간 처리, 반복 스케줄 생성까지 손쉽게 구현할 수 있습니다.

기존 date() 기반 함수보다 객체 지향적이며 확장성 있는 코드 작성이 가능하므로, PHP 날짜 처리의 핵심 도구로 꼭 익혀두세요!

지금까지 토스트데브였습니다 😊

 

#PHP, #DateTime, #날짜계산, #DateInterval, #DatePeriod, #PHP날짜, #시간처리, #웹개발, #PHP기초, #날짜함수

반응형