PHP 프로젝트를 진행하다 보면 시작 날짜부터 종료 날짜까지 모든 날짜를 목록으로 가져와야 하는 경우가 종종 있습니다. 예를 들어 캘린더 기능, 통계 집계, 예약 시스템 등을 구현할 때 유용하게 활용됩니다. 이 글에서는 strtotime() 함수와 반복문을 조합하여 두 날짜 사이의 모든 날짜를 배열로 반환하는 방법을 소개합니다.
예제 코드
<?php
function displayDates($date1, $date2, $format = 'd-m-Y') {
$dates = array();
$current = strtotime($date1);
$date2 = strtotime($date2);
$stepVal = '+1 day';
while ($current <= $date2) {
$dates[] = date($format, $current);
$current = strtotime($stepVal, $current);
}
return $dates;
}
$date = displayDates('2019-11-10', '2019-11-20');
var_dump($date);
?>코드 동작 원리
위 코드의 핵심 로직은 다음과 같습니다.
1. 날짜 변환: strtotime() 함수를 사용하여 입력받은 두 날짜를 Unix 타임스탬프(정수 값)로 변환합니다.
2. 반복 처리: while 문으로 현재 타임스탬프가 종료 날짜보다 작거나 같은 동안 반복합니다.
3. 배열 저장: 각 반복마다 date() 함수로 지정한 형식('d-m-Y', 즉 일-월-년)에 맞춰 문자열을 만들어 배열에 추가합니다.
4. 1일씩 증가: strtotime('+1 day', $current)를 통해 현재 날짜에서 하루씩 증가시켜 다음 반복으로 넘어갑니다.
실행 결과
위 코드를 실행하면 아래와 같이 2019년 11월 10일부터 20일까지 총 11개의 날짜가 배열로 출력됩니다.
array(11) {
[0]=>
string(10) "10-11-2019"
[1]=>
string(10) "11-11-2019"
[2]=>
string(10) "12-11-2019"
[3]=>
string(10) "13-11-2019"
[4]=>
string(10) "14-11-2019"
[5]=>
string(10) "15-11-2019"
[6]=>
string(10) "16-11-2019"
[7]=>
string(10) "17-11-2019"
[8]=>
string(10) "18-11-2019"
[9]=>
string(10) "19-11-2019"
[10]=>
string(10) "20-11-2019"
}참고: DateTime 클래스를 활용한 대체 방법
PHP 5.3 이상에서는 객체 지향 방식인 DateTime과 DateInterval 클래스를 사용하는 것이 더 권장됩니다. 코드가 더 직관적이며 날짜 계산 오류 가능성도 줄어듭니다.
$begin = new DateTime('2019-11-10');
$end = new DateTime('2019-11-20');
$interval = new DateInterval('P1D'); // 1일 간격
$daterange = new DatePeriod($begin, $interval, $end->modify('+1 day'));
foreach ($daterange as $date) {
echo $date->format("d-m-Y") . <br/>;
}DatePeriod를 활용하면 별도의 반복문 로직 없이도 날짜 범위를 깔끔하게 처리할 수 있으므로, 최신 PHP 환경이라면 이 방식을 우선적으로 고려해 보시기 바랍니다.