PHP로 개발하다 보면 날짜와 시간을 다루는 경우가 매우 많습니다. 게시판 작성일 표시, 예약 시스템 체크인·체크아웃 계산, 통계 기간 조회, 검색 조건 처리 등 거의 모든 웹 프로그램에서 사용됩니다.
특히 date(), strtotime(), mktime() 함수는 PHP에서 날짜를 다룰 때 가장 많이 사용하는 함수입니다.
저 역시 예약 시스템과 통계 기능을 개발할 때 거의 매일 사용하고 있으며, 날짜 계산 오류 때문에 예상치 못한 버그를 겪은 적도 많았습니다.
이번 글에서는 실제 개발 현장에서 자주 사용하는 예제를 중심으로 date(), strtotime(), mktime() 함수 사용법을 정리해보겠습니다.
PHP 날짜 함수가 중요한 이유
웹 프로그램에서 날짜는 단순히 출력만 하는 것이 아닙니다.
예를 들어 다음과 같은 작업이 필요합니다.
- 최근 7일 게시물 조회
- 한 달 전 주문 내역 검색
- 예약 가능 날짜 계산
- 회원 가입 후 30일 경과 여부 확인
- 통계 기간 생성
이때 date(), strtotime(), mktime() 함수를 조합하면 대부분 해결할 수 있습니다.
date (2025.12.25 기준 PHP 4, PHP 5, PHP 7, PHP 8)
date(string $format, ?int $timestamp = null): string
옵션 사용방법
// yyyy-mm-dd 형식으로 출력
echo date("Y-m-d");
=> 2022-10-23
// yy-m-d 형식으로 출력(월이 10 미만이면 한자리로 출력, 일도 마찬가지)
echo date("y-n-j");
=> 22-10-23
// 월의 이름 구하기(전체 이름, 앞 3자, 숫자 2자, 숫자)
echo date("F, M, m, n");
=> October, Oct, 10, 10
// 월이 일수 구하기
echo date("t");
=> 31
// 요일(숫자형식, 요일명 앞 3자)
echo date("w, D");
=> 0, Sun
// 오전, 오후 출력
echo date("a");
=> am
날짜 계산
// 오늘 날짜 시간을 출력한다.
echo date("Y-m-d H:i:s");
echo date("Y-m-d H:i:s", strtotime("now"));
=> 2022-10-23 10:45:24
// 어제
echo date("Y-m-d H:i:s", strtotime("-1 days"));
=> 2022-10-22 10:45:24
// 내일
echo date("Y-m-d H:i:s", strtotime("+1 days"));
=> 2022-10-24 10:45:24
// 어제2
echo date("Y-m-d H:i:s", strtotime("yesterday"));
=> 2022-10-22 00:00:00
// 내일2
echo date("Y-m-d H:i:s", strtotime("tomorrow"));
=> 2022-10-24 00:00:00
// 지난 주
echo date("Y-m-d H:i:s", strtotime("-1 weeks"));
echo date("Y-m-d H:i:s", strtotime("last weeks"));
echo date("Y-m-d H:i:s", strtotime("-7 days"));
=> 2022-10-16 10:45:24
// 다음 주
echo date("Y-m-d H:i:s", strtotime("+1 weeks"));
echo date("Y-m-d H:i:s", strtotime("next weeks"));
echo date("Y-m-d H:i:s", strtotime("+7 days"));
=> 2022-10-30 10:45:24
// 지난 달
echo date("Y-m-d H:i:s", strtotime("-1 months"));
echo date("Y-m-d H:i:s", strtotime("last months"));
=> 2022-09-23 10:45:24
// 다음 달
echo date("Y-m-d H:i:s", strtotime("+1 months"));
echo date("Y-m-d H:i:s", strtotime("next months"));
=> 2022-11-23 10:45:24
※ 만약 오늘이 1월 31일이라면 이 방식대로 처리했을 때
=> 2022-03-03 10:45:24
echo date("Y-m-d H:i:s", mktime(0, 0, 0, date("m") + 1, 1, date("Y")));
=> 2022-02-01 10:45:24
echo date("Y-m-t H:i:s", mktime(0, 0, 0, date("m") + 1, 1, date("Y")));
=> 2022-02-28 10:45:24
// 작년
echo date("Y-m-d H:i:s", strtotime("-1 years"));
echo date("Y-m-d H:i:s", strtotime("last years"));
echo date("Y-m-d H:i:s", strtotime("-12 months"));
=> 2021-10-23 10:45:24
// 내년
echo date("Y-m-d H:i:s", strtotime("+1 years"));
echo date("Y-m-d H:i:s", strtotime("next years"));
echo date("Y-m-d H:i:s", strtotime("+12 months"));
=> 2023-10-23 10:45:24
strtotime (2025.12.25 기준 PHP 4, PHP 5, PHP 7, PHP 8)
strtotime(string $datetime, ?int $baseTimestamp = null): int|false
mktime (2025.12.25 기준 PHP 4, PHP 5, PHP 7, PHP 8)
mktime(
int $hour,
?int $minute = null,
?int $second = null,
?int $month = null,
?int $day = null,
?int $year = null
): int|false
1970년부터 올해까지 10년 주기로 연도를 추출, 처음에는 1970년부터지만 2번째부터는 1981, 1991 이런식으로 2025년까지 출력
$startYear = 1970;
$currentYear = (int)date('Y');
$result = [];
// 1. 첫 구간 (1970 - 1980)
$firstEnd = 1980;
$result[] = [
'start' => $startYear,
'end' => min($firstEnd, $currentYear)
];
// 다음 시작 연도
$year = $firstEnd + 1;
// 2. 이후 10년 단위
while ($year <= $currentYear) {
$endYear = $year + 9;
if ($endYear > $currentYear) {
$endYear = $currentYear;
}
$result[] = [
'start' => $year,
'end' => $endYear
];
$year = $endYear + 1;
}
// 출력 예시
foreach ($result as $range) {
echo $range['start'] . ' - ' . $range['end'] . PHP_EOL;
}
// 출력 결과 (2025년 기준)
1970 - 1980
1981 - 1990
1991 - 2000
2001 - 2010
2011 - 2020
2021 - 2025
실제 개발 사례
제가 개발했던 객실 예약 시스템에서는 월별 예약 현황을 조회하는 기능이 있었습니다.
처음에는 다음 달 계산을 위해 다음과 같이 작성했습니다.
strtotime("+1 month")
그런데 1월 31일에 조회하면 3월로 넘어가는 문제가 발생했습니다.
결국 다음 달의 시작일과 종료일을 계산할 때는 mktime()을 사용하도록 수정했고 이후 날짜 오류가 발생하지 않았습니다.
날짜 계산은 평소에는 정상 동작하다가 특정 날짜에서만 오류가 발생하기 때문에 반드시 테스트가 필요합니다.
연도를 10년 단위로 그룹화하기
통계 기능이나 연도 선택 박스를 만들 때 자주 사용하는 코드입니다.
1970년부터 현재 연도까지 10년 단위로 분리합니다.
$startYear = 1970;
$currentYear = (int)date('Y');
$result = [];
$firstEnd = 1980;
$result[] = [
'start' => $startYear,
'end' => min($firstEnd, $currentYear)
];
$year = $firstEnd + 1;
while ($year <= $currentYear) {
$endYear = $year + 9;
if ($endYear > $currentYear) {
$endYear = $currentYear;
}
$result[] = [
'start' => $year,
'end' => $endYear
];
$year = $endYear + 1;
}
출력 결과
1970 - 1980
1981 - 1990
1991 - 2000
2001 - 2010
2011 - 2020
2021 - 2025
연도별 통계 페이지나 졸업 연도 선택 기능에서 활용할 수 있습니다.
정리
PHP 날짜 처리에서 가장 많이 사용하는 함수는 다음 3가지입니다.
- date() : 날짜 출력
- strtotime() : 날짜 계산
- mktime() : 특정 날짜 생성
간단한 날짜 계산은 strtotime()으로 충분합니다.
하지만 월 계산이나 정산 기능처럼 날짜 정확성이 중요한 경우에는 mktime()을 함께 사용하는 것이 안전합니다.
특히 1월 31일 → 다음 달 계산 문제는 실제 서비스에서도 자주 발생하는 버그이므로 반드시 테스트해보는 것을 추천합니다.