두 날짜가 같은 형식으로 되어 있다면 PHP에서 날짜를 비교하는 일은 매우 간단합니다. 하지만 형식이 서로 다르면 단순 비교만으로는 올바른 결과를 얻기 어렵습니다. 이 글에서는 PHP에서 날짜를 비교하는 대표적인 세 가지 방법을 예제와 함께 살펴보고, DateTime 클래스와 strtotime() 함수를 활용하는 방법까지 자세히 알아보겠습니다.
방법 1. 같은 형식의 날짜 비교하기
비교하려는 두 날짜가 동일한 형식(예: YYYY-MM-DD)이라면 별도의 변환 없이 단순 비교 연산자만으로 바로 비교할 수 있습니다.
<?php
$date1 = "2018-11-24";
$date2 = "2019-03-26";
if ($date1 > $date2)
echo "$date1 은 $date2 보다 이후 날짜입니다.";
else
echo "$date1 은 $date2 보다 이전 날짜입니다.";
?>
실행 결과
2018-11-24 은 2019-03-26 보다 이전 날짜입니다.
코드 설명
$date1과 $date2가 모두 'YYYY-MM-DD' 형식으로 선언되어 있기 때문에, 문자열 그대로 비교 연산자(>)를 사용해 크기를 비교했습니다. 이 형식은 연도, 월, 일 순서로 정렬되어 있어 문자열 비교 결과가 실제 날짜 순서와 일치합니다.
방법 2. strtotime()으로 다른 형식의 날짜 비교하기
두 날짜의 형식이 서로 다르다면 strtotime() 함수를 사용해 날짜 문자열을 UNIX 타임스탬프(숫자)로 변환한 뒤 비교하면 됩니다. 타임스탬프는 단순한 정수이므로 어떤 형식의 날짜라도 일관된 기준으로 비교할 수 있습니다.
예제
<?php
$date1 = "18-03-22";
$date2 = "2017-08-24";
$timestamp1 = strtotime($date1);
$timestamp2 = strtotime($date2);
if ($timestamp1 > $timestamp2)
echo "$date1 은 $date2 보다 이후 날짜입니다.";
else
echo "$date1 은 $date2 보다 이전 날짜입니다.";
?>
실행 결과
18-03-22 은 2017-08-24 보다 이후 날짜입니다.
코드 설명
이 예제의 두 날짜는 형식이 서로 다릅니다('YY-MM-DD'와 'YYYY-MM-DD'). strtotime() 함수로 두 날짜를 숫자형 UNIX 타임스탬프로 변환한 후, 비교 연산자로 크기를 비교하여 원하는 결과를 얻었습니다.
방법 3. DateTime 클래스 객체로 비교하기
객체 지향적인 방식을 선호한다면 DateTime 클래스 객체를 생성해 날짜를 비교할 수 있습니다. DateTime 객체는 비교 연산자를 직접 지원하므로 코드가 더 직관적이고 가독성이 뛰어납니다.
예제
<?php
$date1 = new DateTime("18-02-24");
$date2 = new DateTime("2019-03-24");
if ($date1 > $date2) {
echo 'datetime1이 datetime2보다 이후입니다.';
}
if ($date1 < $date2) {
echo 'datetime1이 datetime2보다 이전입니다.';
}
if ($date1 == $date2) {
echo 'datetime1과 datetime2가 같습니다.';
}
?>
실행 결과
datetime1이 datetime2보다 이전입니다.
코드 설명
DateTime 클래스로 두 개의 날짜 객체를 생성한 뒤, 비교 연산자(>, <, ==)를 사용해 두 날짜의 선후 관계를 판별했습니다. DateTime 객체는 내부적으로 타임스탬프를 기준으로 비교되므로 날짜 형식이 달라도 안전하게 비교할 수 있습니다.
마무리 및 추가 팁
세 가지 방법을 정리하면 다음과 같습니다.
- 같은 형식의 날짜: 문자열 그대로 비교 연산자 사용 가능
- 다른 형식의 날짜: strtotime()으로 UNIX 타임스탬프 변환 후 비교
- 객체 지향 방식: DateTime 클래스 객체 생성 후 비교 연산자 사용
추가로, 'DD-MM-YYYY'처럼 해석이 애매할 수 있는 형식의 날짜를 다룰 때는 DateTime::createFromFormat()을 사용하면 지정한 형식대로 정확하게 파싱할 수 있습니다. 또한 시간대(timezone)가 중요한 애플리케이션에서는 DateTime 객체에 명시적으로 시간대를 지정해 주는 것이 좋습니다.