반응형
Web Development · PHP 날짜·시간 함수
PHP checkdate() — 날짜 유효성을 검사하는 함수
2월 31일 같은 없는 날짜 차단 · 윤년 자동 처리 · 폼 입력 검증 완전 정리
시작 오늘 분석할 코드
checkdate()는 월·일·연도가 실제로 존재하는 날짜인지 검사하는 함수입니다. 2월 31일, 4월 31일처럼 달력에 없는 날짜를 걸러낼 때 사용합니다. 윤년도 자동으로 처리하므로 2024년 2월 29일(윤년)은 통과하고 2023년 2월 29일(평년)은 거부합니다.
<?php $month = 2; $day = 31; $year = 2014; if (!checkdate($month, $day, $year)) { // 존재하지 않는 날짜면 false 반환 → ! 로 뒤집어 진입 print "날짜를 올바르게 입력하세요."; } // 2월은 28일(평년)/29일(윤년)까지 → 31일은 없음 → false ?>
실제 출력 미리보기
checkdate(2, 31, 2014)
false
2월 31일은 존재하지 않음
checkdate(2, 29, 2024)
true
2024년은 윤년 → 2/29 존재
용어 용어 정리
checkdate()checkdate($month, $day, $year) — 세 인수 순서 주의: 월,일,연 순
반환값유효한 날짜면 true, 유효하지 않으면 false 반환
윤년4로 나눠지되 100으로 나눠지면 안 되고(단, 400의 배수는 윤년). checkdate가 자동 처리
그레고리력checkdate는 그레고리력(현재 전 세계 표준 달력) 기준으로 날짜 유효성 검사
폼 날짜 검증사용자가 드롭다운으로 월/일/년 조합 입력 시 불가능한 날짜 거부에 사용
범위 검사월은 1~12, 일은 해당 월의 최대 일수, 연도는 양수여야 함
strtotime 차이strtotime은 잘못된 날짜를 조용히 보정. checkdate는 유효성만 판단
DateTime 클래스PHP 5.2+의 DateTime 클래스도 날짜 유효성 처리 가능 (OOP 방식)
1 인수 순서 — 월·일·연 (헷갈리기 쉬운 순서)
checkdate($month, $day, $year) — 월이 첫 번째
checkdate()의 인수 순서는 월, 일, 연입니다. 날짜 표기(연-월-일)와 반대라 실수하기 쉬운 부분입니다. 첫 번째가 월(1~12), 두 번째가 일, 세 번째가 연도입니다.
// 올바른 인수 순서: 월, 일, 연 checkdate(12, 25, 2025); // 2025년 12월 25일 → true checkdate(2, 29, 2024); // 2024년 2월 29일 → true (윤년) checkdate(2, 29, 2023); // 2023년 2월 29일 → false (평년) checkdate(4, 31, 2025); // 2025년 4월 31일 → false (4월은 30일까지) checkdate(13, 1, 2025); // 월이 13 → false (월은 1~12)
⚠️ 인수 순서가 월, 일, 연입니다. "연-월-일"에 익숙해진 상태에서 실수하기 쉬운 함수입니다.
2 윤년 자동 처리 — 2월 29일 검증
4로 나눠지는 해지만 100의 배수는 제외 (400의 배수는 포함)
윤년 규칙을 직접 구현하면 복잡하지만, checkdate()가 자동으로 처리합니다. 2000년은 400의 배수라 윤년, 1900년은 100의 배수라 평년입니다.
checkdate(2, 29, 2024); // true — 2024년은 윤년 (4의 배수) checkdate(2, 29, 2023); // false — 2023년은 평년 checkdate(2, 29, 2000); // true — 2000년은 400의 배수 → 윤년 checkdate(2, 29, 1900); // false — 1900년은 100의 배수(400 아님) → 평년
3 폼 날짜 입력 검증 패턴
드롭다운 월/일/년 입력 후 조합의 유효성 확인
생년월일처럼 드롭다운 3개(연/월/일)로 날짜를 입력받을 때, 각 값이 범위 내에 있더라도 조합이 유효하지 않을 수 있습니다. checkdate()로 조합 유효성을 확인합니다.
$year = (int) $_POST['year']; $month = (int) $_POST['month']; $day = (int) $_POST['day']; if (!checkdate($month, $day, $year)) { die("올바른 날짜를 입력하세요."); } // 유효한 날짜면 처리 계속 $birth = sprintf('%04d-%02d-%02d', $year, $month, $day);
※ 사용자 입력은 정수 캐스팅(int)으로 먼저 숫자화한 뒤 checkdate에 넘기는 것이 안전합니다.
반응형
4 strtotime와 차이 — 조용한 보정 vs 명시적 거부
strtotime은 잘못된 날짜를 자동 보정해버림
strtotime()은 잘못된 날짜를 자동으로 보정합니다. "2014-02-31"은 "2014-03-03"으로 조용히 이동합니다. checkdate()는 유효성만 판단하고, 실제 날짜 변환은 하지 않습니다.
strtotime — 자동 보정 (주의)
strtotime('2014-02-31')
→ 2014-03-03으로 이동
오류 없이 통과 — 날짜 오염
→ 2014-03-03으로 이동
오류 없이 통과 — 날짜 오염
checkdate — 명시적 거부
checkdate(2, 31, 2014)
→ false 반환
존재하지 않는 날짜임을 명시적 알림
→ false 반환
존재하지 않는 날짜임을 명시적 알림
5 실전 예 — 이벤트 예약 날짜 검증
과거 날짜 거부 + 유효성 동시 검증
$month = 2; $day = 31; $year = 2026; if (!checkdate($month, $day, $year)) { echo "존재하지 않는 날짜입니다."; } elseif (mktime(0,0,0,$month,$day,$year) < time()) { echo "과거 날짜는 예약할 수 없습니다."; } else { echo "예약이 완료되었습니다."; }
6 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
| 인수 순서 혼동 (연-월-일로 넣음) | checkdate(2025, 6, 15) — 월이 2025라 항상 false | 순서는 월, 일, 연 — checkdate($month, $day, $year) |
| strtotime로 유효성 판단 | 2월 31일이 3월 3일로 자동 보정돼 검증 통과 | 유효성 검사에는 checkdate() 사용 |
| 문자열 인수 전달 | checkdate("02", "31", "2014") — 형변환되지만 의도 불명확 | 명시적 정수 캐스팅 후 전달: (int)$_POST['month'] |
| 반환값을 !로 뒤집지 않음 | if(checkdate(...)) { "오류 메시지" } — 유효 날짜에 오류 출력 | checkdate가 false일 때(=! 결과가 true) 오류 처리 |
| 유효성 검사 없이 DB 저장 | 2014-02-31 같은 잘못된 날짜가 DB에 삽입됨 | 항상 checkdate 검증 후 INSERT |
핵심 한 줄 요약
checkdate($m, $d, $y)유효한 날짜면 true, 없는 날짜면 false — 인수 순서: 월,일,연
윤년 자동 처리2024-02-29는 true, 2023-02-29는 false — 윤년 규칙 내장
vs strtotimestrtotime는 잘못된 날짜를 보정, checkdate는 거부 — 검증엔 checkdate
폼 검증 패턴if (!checkdate($month, $day, $year)) { 오류 처리 }
주의인수 순서가 월,일,연 — 연-월-일과 헷갈리지 않도록
Tags
#PHP #checkdate #날짜유효성 #날짜검증 #윤년 #폼검증 #PHP날짜함수 #PHP함수 #PHP학습 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, checkdate, 날짜유효성, 날짜검증, 윤년, 폼검증, 날짜확인, PHP날짜함수, PHP함수, PHP학습, 웹개발, 티스토리
반응형
'php' 카테고리의 다른 글
| PHP date() — 타임스탬프를 날짜 문자열로 포맷 · 포맷 문자 표 완전 정리 (0) | 2026.07.11 |
|---|---|
| PHP mktime() — 특정 날짜의 타임스탬프 생성 · date 연계 · 날짜 계산 완전 정리 (0) | 2026.07.10 |
| PHP time() — 유닉스 타임스탬프 · date() 연계 · 날짜 계산 완전 정리 (0) | 2026.07.10 |
| PHP trim() — 양끝 공백 제거 · ltrim · rtrim · 커스텀 문자 완전 정리 (0) | 2026.07.10 |
| PHP substr() — 문자열 일부 추출 · 음수 인덱스 · mb_substr 차이 완전 정리 (0) | 2026.07.10 |
왕진 블로그

댓글