728x90

웹이나 프로그램에서 월/일(MM/DD) 입력을 받아, 기준일 기준으로 가장 가까운 날짜의 연도를 선택해야 하는 경우가 있습니다.
예를 들어, 사용자가 12/01을 입력했을 때, 기준일이 2025-12-01이라면 내년 2026-01-01이 가장 가깝습니다.
이번 글에서는 거리 계산 방법, 후보 연도, 최종 날짜 선택, 그리고 PHP 자동화 방법까지 정리합니다.
1. 규칙 정의
- 기준일 연도를 기준으로 후보 날짜 생성
- 후보 = 작년, 금년, 내년
- 예: 입력 01/01, 기준일 2025-12-01
- 작년 후보: 2024-01-01
- 금년 후보: 2025-01-01
- 내년 후보: 2026-01-01
- 거리 계산
- 기준일과 후보 날짜 사이 절대일수 계산
- 거리 = abs(기준일 - 후보일)
- 최종 날짜 선택
- 절대일수가 가장 작은 후보 날짜 선택
- 최종 날짜의 연도 ≠ 기준일 연도 → [YYYY-MM-DD] 표시
- 최종 날짜의 연도 = 기준일 연도 → 그냥 표시
2. 예시 10개
| 기준일 | 입력(mm/dd) | 거리(작년) | 거리(금년 | 거리(내년) | 최종 날짜 |
| 2025-12-01 | 01/01 | 700 (2024-01-01) | 334 (2025-01-01) | 31 (2026-01-01) | [2026-01-01] |
| 2026-06-01 | 12/31 | 578 (2025-12-31) | 213 (2026-12-31) | 152 (2027-12-31) | 2026-12-31 |
| 2024-03-15 | 11/20 | 690 (2023-11-20) | 250 (2024-11-20) | 610 (2025-11-20) | 2024-11-20 |
| 2027-08-10 | 02/28 | 534 (2026-02-28) | 165 (2027-02-28) | 202 (2028-02-28) | 2027-02-28 |
| 2025-01-02 | 07/15 | 201 (2024-07-15) | 194 (2025-07-15) | 197 (2026-07-15) | 2025-07-15 |
| 2023-09-01 | 05/05 | 119 (2022-05-05) | 118 (2023-05-05) | 246 (2024-05-05) | 2023-05-05 |
| 2026-11-20 | 03/01 | 325 (2025-03-01) | 264 (2026-03-01) | 305 (2027-03-01) | 2026-03-01 |
| 2024-02-28 | 12/31 | 307 (2023-12-31) | 307 (2024-12-31) | 335 (2025-12-31) | 2024-12-31 |
| 2025-07-10 | 01/10 | 182 (2024-01-10) | 182 (2025-01-10) | 518 (2026-01-10) | 2025-01-10 |
| 2027-03-15 | 08/10 | 148 (2026-08-10) | 147 (2027-08-10) | 515 (2028-08-10) | 2027-08-10 |
3. 거리 계산 시 주의점
- 윤년, 월별 일수 고려 필요
- 날짜가 기준일 이전/이후 모두 절대값으로 계산
- 최종 날짜 결정 시 연도 변경 여부만 [ ] 표시
4. PHP 예제 코드
<?php
function closestDate($base, $mmdd) {
$baseDate = new DateTime($base);
list($m, $d) = explode('/', $mmdd);
$year = (int)$baseDate->format('Y');
$candidates = [
(clone $baseDate)->setDate($year-1, $m, $d),
(clone $baseDate)->setDate($year, $m, $d),
(clone $baseDate)->setDate($year+1, $m, $d),
];
$distances = [];
foreach ($candidates as $dt) {
// 큰 날짜 - 작은 날짜
if ($dt > $baseDate) {
$diff = $dt->diff($baseDate)->days;
} else {
$diff = $baseDate->diff($dt)->days;
}
$distances[] = $diff;
}
$minIndex = array_keys($distances, min($distances))[0];
$final = $candidates[$minIndex];
$finalStr = $final->format('Y-m-d');
if ($final->format('Y') != $year) {
$finalStr = "[$finalStr]";
}
return [
'distances' => $distances,
'dates' => array_map(fn($d)=>$d->format('Y-m-d'), $candidates),
'final' => $finalStr
];
}
// 테스트
print_r(closestDate('2025-12-01', '01/01'));
출력:
distances: [700, 334, 31]
dates: ['2024-01-01', '2025-01-01', '2026-01-01']
final: [2026-01-01]
5. 활용 팁
- UI에서 MM/DD 입력만 받을 때, 기준일 기준으로 가장 가까운 연도 자동 계산
- 연말/연초, 윤년 등 특수 날짜 처리 가능
- 블로그, 캘린더 앱, 예약 시스템 등에서 유용
728x90