본문 바로가기
PHP

[PHP] 날짜 및 시간 객체 선언하여 다루기

by teamnova 2025. 8. 10.
728x90

 웹 애플리케이션 개발에서 날짜와 시간은 로그인 기록, 게시물 작성 시간, 예약 시스템 등 거의 모든 곳에서 사용되는 중요한 요소입니다. PHP는 날짜와 시간을 다루는 다양한 방법을 제공하지만, 
그중에서도 DateTime 객체는 복잡한 날짜 연산을 쉽게 만들어줍니다.

 

그럼 어디에 사용하면 좋을까요?

데이터의 무결성 및 정확성 보장:
로그 및 감사 추적: 누가, 언제, 무엇을 했는지 정확히 기록해야 시스템의 보안을 강화하고 문제 발생 시 원인을 파악할 수 있습니다.
데이터 정합성: 게시물, 댓글, 주문 등 모든 데이터는 생성 시점 정보가 있어야 일관성 있게 관리될 수 있습니다.

 

비즈니스 로직 구현:
할인 기간, 이벤트 종료일: 특정 기간에만 적용되는 프로모션이나 이벤트의 시작/종료 시점을 정확히 제어해야 합니다.
보고서 생성: 월별, 분기별, 연간 보고서를 생성할 때 정확한 날짜 범위 설정이 필수적입니다.
데이터 만료 처리: 세션 만료, 임시 파일 삭제 등 일정 시간이 지나면 자동으로 처리되어야 하는 로직을 구현합니다.

 

코드예제

 PHP의 기본 날짜/시간 함수: date()

date_default_timezone_set('Asia/Seoul'); // 시간대 설정은 항상 먼저!

// 1. 현재 날짜와 시간으로 DateTime 객체 생성
$now = new DateTime();
echo "현재 시간: " . $now->format("Y-m-d H:i:s") . "\n";

// 2. 특정 날짜 문자열로 DateTime 객체 생성
$specificDate = new DateTime("2023-12-25 14:30:00");
echo "특정 날짜: " . $specificDate->format("Y년 m월 d일 H시 i분") . "\n";

// 3. 다양한 형식의 날짜 문자열도 파싱 가능 (상대적인 날짜 표현도 가능!)
$tomorrow = new DateTime("tomorrow");
echo "내일: " . $tomorrow->format("Y-m-d") . "\n";

$lastWeek = new DateTime("last week");
echo "지난주: " . $lastWeek->format("Y-m-d") . "\n";

$myBirthday = new DateTime("1990-05-15");
echo "내 생일: " . $myBirthday->format("Y-m-d") . "\n";

// 에러 처리: 잘못된 날짜 형식으로 생성 시 false 반환 (PHP 8.0부터는 Warning 발생 후 DateTime 객체 반환)
// `DateTimeImmutable`을 사용하면 InvalidArgumentException 발생
$invalidDate = DateTime::createFromFormat("Y.m.d", "2023-10-27"); // 올바른 포맷으로 시도
if ($invalidDate) {
    echo "유효한 날짜: " . $invalidDate->format("Y-m-d") . "\n";
} else {
    echo "잘못된 날짜 형식입니다.\n";
}

 

DateTime 객체는 날짜와 시간을 객체로 다룸


// 1. 현재 날짜와 시간으로 DateTime 객체 생성
$now = new DateTime();
echo "현재 시간: " . $now->format("Y-m-d H:i:s") . "\n";

// 2. 특정 날짜 문자열로 DateTime 객체 생성
$specificDate = new DateTime("2023-12-25 14:30:00");
echo "특정 날짜: " . $specificDate->format("Y년 m월 d일 H시 i분") . "\n";

// 3. 다양한 형식의 날짜 문자열도 파싱 가능 (상대적인 날짜 표현도 가능!)
$tomorrow = new DateTime("tomorrow");
echo "내일: " . $tomorrow->format("Y-m-d") . "\n";

$lastWeek = new DateTime("last week");
echo "지난주: " . $lastWeek->format("Y-m-d") . "\n";

$myBirthday = new DateTime("1990-05-15");
echo "내 생일: " . $myBirthday->format("Y-m-d") . "\n";

// 에러 처리: 잘못된 날짜 형식으로 생성 시 false 반환 (PHP 8.0부터는 Warning 발생 후 DateTime 객체 반환)
// `DateTimeImmutable`을 사용하면 InvalidArgumentException 발생
$invalidDate = DateTime::createFromFormat("Y.m.d", "2023-10-27"); // 올바른 포맷으로 시도
if ($invalidDate) {
    echo "유효한 날짜: " . $invalidDate->format("Y-m-d") . "\n";
} else {
    echo "잘못된 날짜 형식입니다.\n";
}

 

 날짜/시간 포맷팅: format() 메서드

$dt = new DateTime();

echo "YYYY-MM-DD HH:II:SS: " . $dt->format("Y-m-d H:i:s") . "\n";
echo "YYYY년 MM월 DD일: " . $dt->format("Y년 m월 d일") . "\n";
echo "요일 (영문): " . $dt->format("l") . "\n"; // Monday ~ Sunday
echo "요일 (약어): " . $dt->format("D") . "\n"; // Mon ~ Sun
echo "오전/오후: " . $dt->format("A") . "\n"; // AM/PM (대문자)
echo "Unix 타임스탬프: " . $dt->format("U") . "\n";

 

날짜/시간 더하기 및 빼기: add()와 sub() 메서드

$today = new DateTime();
echo "오늘 날짜: " . $today->format("Y-m-d") . "\n";

// 5일 더하기
$futureDate = (new DateTime())->add(new DateInterval('P5D'));
echo "5일 후: " . $futureDate->format("Y-m-d") . "\n";

// 2개월 10일 빼기
$pastDate = (new DateTime())->sub(new DateInterval('P2M10D'));
echo "2개월 10일 전: " . $pastDate->format("Y-m-d") . "\n";

// 1년 3개월 2주 5일 더하기 (P: Period, Y: Year, M: Month, W: Week, D: Day)
// T: Time, H: Hour, I: Minute, S: Second
$complexAdd = (new DateTime())->add(new DateInterval('P1Y3M2W5DT3H10M'));
echo "복합적으로 더하기: " . $complexAdd->format("Y-m-d H:i:s") . "\n";

 

날짜/시간 비교: diff() 메서드

$startDate = new DateTime("2023-01-01");
$endDate = new DateTime("2023-10-27");

$interval = $startDate->diff($endDate);

echo "시작일: " . $startDate->format("Y-m-d") . "\n";
echo "종료일: " . $endDate->format("Y-m-d") . "\n";
echo "두 날짜의 차이:\n";
echo "  - 총 년: " . $interval->y . "년\n";
echo "  - 총 월: " . $interval->m . "개월\n";
echo "  - 총 일: " . $interval->d . "일\n";
echo "  - 총 시간: " . $interval->h . "시간\n";
echo "  - 총 분: " . $interval->i . "분\n";
echo "  - 총 초: " . $interval->s . "초\n";
echo "  - 총 일수 (절대값): " . $interval->days . "일\n"; // 시작일과 종료일 간의 총 일수
echo "  - 방향 (1: 미래, -1: 과거): " . ($interval->invert ? "과거" : "미래/현재") . "\n";

// D-Day 계산
$today = new DateTime();
$examDate = new DateTime("2023-11-30");
$dDay = $today->diff($examDate);

if ($dDay->invert) { // invert가 true면 $examDate가 과거
    echo "시험이 이미 지났습니다. (" . $dDay->days . "일 전)\n";
} else if ($dDay->days == 0) {
    echo "시험 당일입니다!\n";
} else {
    echo "시험까지 D-" . $dDay->days . "일 남았습니다!\n";
}