카테고리 없음

MM/DD 입력 기준으로 기준일과 가장 가까운 연도 계산하기 (작년/금년/내년)

_Blue_Sky_ 2025. 11. 25. 20:50
728x90

웹이나 프로그램에서 월/일(MM/DD) 입력을 받아, 기준일 기준으로 가장 가까운 날짜의 연도를 선택해야 하는 경우가 있습니다.
예를 들어, 사용자가 12/01을 입력했을 때, 기준일이 2025-12-01이라면 내년 2026-01-01이 가장 가깝습니다.

이번 글에서는 거리 계산 방법, 후보 연도, 최종 날짜 선택, 그리고 PHP 자동화 방법까지 정리합니다.


1. 규칙 정의

  1. 기준일 연도를 기준으로 후보 날짜 생성
    • 후보 = 작년, 금년, 내년
    • 예: 입력 01/01, 기준일 2025-12-01
      • 작년 후보: 2024-01-01
      • 금년 후보: 2025-01-01
      • 내년 후보: 2026-01-01
  2. 거리 계산
    • 기준일과 후보 날짜 사이 절대일수 계산
    • 거리 = abs(기준일 - 후보일)
  3. 최종 날짜 선택
    • 절대일수가 가장 작은 후보 날짜 선택
    • 최종 날짜의 연도 ≠ 기준일 연도 → [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