본문 바로가기
컴퓨터관련

Java를 이용하여 2016년부터 2030년까지 공휴일 데이터 조회해보자

by 기록이답이다 2016. 1. 26.
반응형

 

 

아래 포스팅된 Java를 이용하여 음력과 양력 변환하기 를 이용하여 2016년 부터 2030년까지 공휴일을 조회해보자

소스는 아래와 같다.

package javatest;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import com.ibm.icu.util.ChineseCalendar;

public class LunarToSolarTest {

	public static Map solarHolidayMap = new HashMap();
	public static Map lunarHolidayMap = new HashMap();

	public static String getDateByString(Date date) {
		return getDateByString(date, "-");
	}

	public static String getDateByString(Date date, String separator) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy"+separator+"MM"+separator+"dd");
		return sdf.format(date);
	}

	/**
     * 양력날짜를 음력날짜로 변환
     * @param 양력날짜 (yyyyMMdd)
     * @return 음력날짜 (yyyyMMdd)
     */
    private static String converSolarToLunar(String date) {
    	return converSolarToLunar(date, "-");
    }

    private static String converSolarToLunar(String date, String separator) {
    	ChineseCalendar cc = new ChineseCalendar();
    	Calendar cal = Calendar.getInstance();

    	cal.set(Calendar.YEAR, Integer.parseInt(date.substring(0, 4)));
    	cal.set(Calendar.MONTH, Integer.parseInt(date.substring(4, 6)) - 1);
    	cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(date.substring(6)));

    	cc.setTimeInMillis(cal.getTimeInMillis());

    	int y = cc.get(ChineseCalendar.EXTENDED_YEAR) - 2637;
    	int m = cc.get(ChineseCalendar.MONTH) + 1;
    	int d = cc.get(ChineseCalendar.DAY_OF_MONTH);

    	StringBuffer ret = new StringBuffer();
    	ret.append(String.format("%04d", y)).append(separator);
    	ret.append(String.format("%02d", m)).append(separator);
    	ret.append(String.format("%02d", d));

    	return ret.toString();
    } // end converSolarToLunar

    public static String getDay(String date, int amount) {
    	Calendar cal = Calendar.getInstance();
    	cal.set(Integer.parseInt(date.substring(0, 4)), Integer.parseInt(date.substring(4, 6)) - 1, Integer.parseInt(date.substring(6)));
    	cal.add(Calendar.DAY_OF_MONTH, amount);

    	return getDateByString(cal.getTime(), "");
    }

	public static void main(String[] args) throws IOException {
		solarHolidayMap.put("0101", "신정"); solarHolidayMap.put("0301", "삼일절");
		solarHolidayMap.put("0505", "어린이날"); solarHolidayMap.put("0606", "현충일");
		solarHolidayMap.put("0815", "광복절"); solarHolidayMap.put("1003", "개천절");
		solarHolidayMap.put("1009", "한글날"); solarHolidayMap.put("1225", "성탄절");

		lunarHolidayMap.put("0101", "구정"); lunarHolidayMap.put("0102", "구정");
		lunarHolidayMap.put("0408", "석가탄신일"); lunarHolidayMap.put("0814", "추석");
		lunarHolidayMap.put("0815", "추석"); lunarHolidayMap.put("0816", "추석");

    	int year = 2016;
    	int endYear = 2030;

    	Calendar c = Calendar.getInstance();
        c.set(year, 0, 1); // 1월 1일부터 시작

        String solarDate = "";
        String lunarDate = "";
    	for(int i=year; i<=endYear;) {
    		solarDate = getDateByString(c.getTime(), "");
    		lunarDate = converSolarToLunar(solarDate, "");

    		c.add(Calendar.DAY_OF_MONTH, 1);

    		// 양력휴일 체크
    		String solarMmdd = solarDate.substring(4,8);
    		if(solarHolidayMap.containsKey(solarMmdd)) {
    			System.out.println(solarDate + " ==> " + solarHolidayMap.get(solarMmdd));
    		}

    		// 음력휴일 체크
    		String lunarMmdd = lunarDate.substring(4,8);
    		if(lunarHolidayMap.containsKey(lunarMmdd)) {
    			// 음력 12월은 마지막날이 29일, 30일 계속 번갈아가면서 있으므로
    			// 양력에서 하루를 빼준날이 구정시작하는 날짜이다.
    			if(lunarMmdd.equals("0101")) System.out.println(getDay(solarDate, -1) + " ==> 구정");
    			System.out.println(solarDate + " ==> " + lunarHolidayMap.get(lunarMmdd));
    		}

    		year = c.get(Calendar.YEAR);
    		if(year != i) {
    			i++;
    			System.out.println("");
    		}
    		if(i > endYear) break;
    	} // end for_i
	} // end main
}

실행결과는 아래와 같다.

반응형