[Java] 📅 Java로 영업일만 7일 출력하는 함수 만들기

반응형

📅 Java로 영업일만 7일 출력하는 함수 만들기

비즈니스 로직을 개발하다 보면 주말과 공휴일을 제외한 영업일만 필요한 경우가 많습니다. 오늘은 Java에서 현재 날짜 기준으로 영업일만 7일을 출력하는 함수를 만들어보겠습니다! 🚀

🎯 요구사항

  • 현재 날짜 기준으로 7일 전까지의 날짜 출력
  • 날짜 형식: 2025-01-01
  • 주말(토, 일) 제외
  • 공휴일 제외

💡 핵심 기능

1️⃣ 영업일 체크 로직

/**
 * 해당 날짜가 영업일인지 확인 (주말과 공휴일 제외)
 */
private static boolean isBusinessDay(LocalDate date) {
    return !isWeekend(date) && !isHoliday(date);
}

2️⃣ 주말 체크

private static boolean isWeekend(LocalDate date) {
    DayOfWeek dayOfWeek = date.getDayOfWeek();
    return dayOfWeek == DayOfWeek.SATURDAY || dayOfWeek == DayOfWeek.SUNDAY;
}

3️⃣ 공휴일 체크 (고정 공휴일)

private static boolean isHoliday(LocalDate date) {
    int month = date.getMonthValue();
    int day = date.getDayOfMonth();
    
    switch (month) {
        case 1: return day == 1;    // 신정 🎊
        case 3: return day == 1;    // 삼일절 🇰🇷
        case 5: return day == 5;    // 어린이날 👶
        case 6: return day == 6;    // 현충일 🕊️
        case 8: return day == 15;   // 광복절 🇰🇷
        case 10: return day == 3 || day == 9; // 개천절, 한글날 📚
        case 12: return day == 25;  // 크리스마스 🎄
        default: return false;
    }
}

🔧 주요 메서드들

📊 영업일 7일 출력

public static void printLast7BusinessDays() {
    LocalDate currentDate = LocalDate.now();
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    
    System.out.println("현재 날짜 기준 영업일만 7일:");
    
    int count = 0;
    int daysBack = 0;
    
    while (count < 7) {
        LocalDate date = currentDate.minusDays(daysBack);
        
        if (isBusinessDay(date)) {
            System.out.println(date.format(formatter) + " (" + getDayOfWeekKorean(date) + ")");
            count++;
        }
        daysBack++;
    }
}

📋 리스트로 반환

public static List<String> getLast7BusinessDays() {
    // 영업일만 7일을 List<String>으로 반환
}

📆 특정 날짜 기준

public static void printLast7BusinessDaysFromDate(LocalDate baseDate) {
    // 특정 날짜를 기준으로 영업일 7일 출력
}

🎨 실행 결과 예시

현재 날짜 기준 영업일만 7일:
2025-06-23 (월)
2025-06-20 (금)
2025-06-19 (목)
2025-06-18 (수)
2025-06-17 (화)
2025-06-16 (월)
2025-06-13 (금)

⚠️ 주의사항

🌙 음력 공휴일 미처리

현재 코드는 고정 공휴일만 처리합니다. 다음 공휴일들은 음력 기준이므로 별도 처리가 필요해요:

  • 설날 🧧
  • 부처님오신날 🪷
  • 추석 🌕

🔄 연도별 호환성

이전 버전에서는 2025년 공휴일만 하드코딩되어 있었지만, 현재 버전은 모든 연도에서 사용 가능합니다! ✨

🚀 사용 방법

public static void main(String[] args) {
    // 1. 현재 날짜 기준 영업일 7일 출력
    printLast7BusinessDays();
    
    // 2. 리스트로 받아서 처리
    List<String> businessDates = getLast7BusinessDays();
    businessDates.forEach(System.out::println);
    
    // 3. 특정 날짜 기준으로 출력
    LocalDate specificDate = LocalDate.of(2024, 12, 31);
    printLast7BusinessDaysFromDate(specificDate);
}

🔮 최종 코드

package com.kyhslam.mlb;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.DayOfWeek;
import java.util.ArrayList;
import java.util.List;


/**
 * 현재 날짜 기준으로 7일 이전의 날짜들을 출력
 */
public class DatePrinter_01 {

    /**
     * 해당 날짜가 고정 공휴일인지 확인
     * @param date 확인할 날짜
     * @return 공휴일이면 true, 아니면 false
     */
    private static boolean isHoliday(LocalDate date) {
        int month = date.getMonthValue();
        int day = date.getDayOfMonth();

        // 고정 공휴일 체크
        switch (month) {
            case 1:
                return day == 1; // 신정
            case 3:
                return day == 1; // 삼일절
            case 5:
                return day == 5; // 어린이날
            case 6:
                return day == 6; // 현충일
            case 8:
                return day == 15; // 광복절
            case 10:
                return day == 3 || day == 9; // 개천절, 한글날
            case 12:
                return day == 25; // 크리스마스
            default:
                return false;
        }

        // 참고: 실제로는 설날, 부처님오신날, 추석은 음력 기준이므로
        // 정확한 계산을 위해서는 음력-양력 변환 라이브러리가 필요합니다.
        // 현재는 고정 공휴일만 처리하고 있습니다.
    }

    /**
     * 해당 날짜가 주말인지 확인
     * @param date 확인할 날짜
     * @return 주말이면 true, 아니면 false
     */
    private static boolean isWeekend(LocalDate date) {
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        return dayOfWeek == DayOfWeek.SATURDAY || dayOfWeek == DayOfWeek.SUNDAY;
    }

    /**
     * 해당 날짜가 영업일인지 확인 (주말과 공휴일 제외)
     * @param date 확인할 날짜
     * @return 영업일이면 true, 아니면 false
     */
    private static boolean isBusinessDay(LocalDate date) {
        return !isWeekend(date) && !isHoliday(date);
    }

    /**
     * 현재 날짜 기준으로 영업일만 7일 출력하는 함수 (주말, 공휴일 제외)
     */
    public static void printLast7BusinessDays() {
        LocalDate currentDate = LocalDate.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        System.out.println("현재 날짜 기준 영업일만 7일:");

        int count = 0;
        int daysBack = 0;

        while (count < 7) {
            LocalDate date = currentDate.minusDays(daysBack);

            if (isBusinessDay(date)) {
                System.out.println(date.format(formatter) + " (" + getDayOfWeekKorean(date) + ")");
                count++;
            }
            daysBack++;
        }
    }

    /**
     * 현재 날짜 기준으로 영업일만 7일을 리스트로 반환하는 함수
     * @return 영업일 날짜 문자열 리스트
     */
    public static List<String> getLast7BusinessDays() {
        LocalDate currentDate = LocalDate.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        List<String> businessDates = new ArrayList<>();

        int count = 0;
        int daysBack = 0;

        while (count < 7) {
            LocalDate date = currentDate.minusDays(daysBack);

            if (isBusinessDay(date)) {
                businessDates.add(date.format(formatter));
                count++;
            }
            daysBack++;
        }

        return businessDates;
    }

    /**
     * 특정 날짜 기준으로 영업일만 7일 출력하는 함수
     * @param baseDate 기준이 되는 날짜
     */
    public static void printLast7BusinessDaysFromDate(LocalDate baseDate) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        System.out.println(baseDate.format(formatter) + " 기준 영업일만 7일:");

        int count = 0;
        int daysBack = 0;

        while (count < 7) {
            LocalDate date = baseDate.minusDays(daysBack);

            if (isBusinessDay(date)) {
                System.out.println(date.format(formatter) + " (" + getDayOfWeekKorean(date) + ")");
                count++;
            }
            daysBack++;
        }
    }

    /**
     * 요일을 한국어로 반환
     * @param date 날짜
     * @return 한국어 요일
     */
    private static String getDayOfWeekKorean(LocalDate date) {
        switch (date.getDayOfWeek()) {
            case MONDAY: return "월";
            case TUESDAY: return "화";
            case WEDNESDAY: return "수";
            case THURSDAY: return "목";
            case FRIDAY: return "금";
            case SATURDAY: return "토";
            case SUNDAY: return "일";
            default: return "";
        }
    }

    // 테스트용 메인 메서드
    public static void main(String[] args) {
        // 현재 날짜 기준으로 영업일만 7일 출력
        printLast7BusinessDays();

        System.out.println("\n" + "=".repeat(40) + "\n");

        // 리스트로 받아서 처리
        List<String> businessDates = getLast7BusinessDays();
        System.out.println("리스트로 반환된 영업일 날짜들:");
        businessDates.forEach(System.out::println);

        System.out.println("\n" + "=".repeat(40) + "\n");

        // 다른 연도 테스트 (2024년)
        LocalDate date2024 = LocalDate.of(2024, 12, 31);
        printLast7BusinessDaysFromDate(date2024);

        System.out.println("\n" + "=".repeat(40) + "\n");

        // 다른 연도 테스트 (2026년)
        LocalDate date2026 = LocalDate.of(2026, 3, 15);
        printLast7BusinessDaysFromDate(date2026);

        System.out.println("\n" + "=".repeat(40) + "\n");

        // 오늘이 영업일인지 확인
        LocalDate today = LocalDate.now();
        System.out.println("오늘(" + today.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ")은 " +
                (isBusinessDay(today) ? "영업일입니다." : "영업일이 아닙니다."));

        System.out.println("\n참고: 현재 고정 공휴일만 처리됩니다.");
        System.out.println("(신정, 삼일절, 어린이날, 현충일, 광복절, 개천절, 한글날, 크리스마스)");
        System.out.println("설날, 부처님오신날, 추석 등 음력 공휴일은 별도 처리가 필요합니다.");
    }
}

 

 

반응형

Designed by JB FACTORY