본문 바로가기
컴퓨터관련

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

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

 

 

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

소스는 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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<string, string=""> solarHolidayMap = new HashMap<string, string="">();
    public static Map<string, string=""> lunarHolidayMap = new HashMap<string, string="">();
 
    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
}
</string,></string,></string,></string,>

실행결과는 아래와 같다.

반응형