개발 등/JAVA

[JAVA] 양력 및 음력 법정공휴일, 일요일 제외한 날짜 조회하기

darkhorizon 2013. 7. 15. 16:20
728x90
반응형

http://apps.icu-project.org/icu-jsp/downloadPage.jsp?ver=4.8.1.1&base=j 


icu4j-4_8_1_1.jar 파일을 lib에 추가.


* 변수를 선언하고 음력 및 양력에 해당하는 값을 배열로 저장한다.

private Calendar cal;

private ChineseCalendar chinaCal;

private String[] solarArr;

private String[] lunarArr;


public DateUtil() {

cal = Calendar.getInstance();

chinaCal = new ChineseCalendar();

solarArr = new String[]{"0101", "0301", "0505", "0606", "0815", "1225"};

lunarArr = new String[]{"0101", "0102", "0408", "0814", "0815", "0816"};

}


/**

 * 해당일자가 음력 법정공휴일에 해당하는 지 확인

 * @param date

 * @return

 */

private boolean isHolidayLunar (String date) {

boolean result = false;

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)));

chinaCal.setTimeInMillis(cal.getTimeInMillis());

/** 음력으로 변환된 월과 일자 **/

int mm = chinaCal.get(ChineseCalendar.MONTH) + 1;

int dd = chinaCal.get(ChineseCalendar.DAY_OF_MONTH);

StringBuilder sb = new StringBuilder();


if (mm < 10)    sb.append("0");

sb.append(mm);

if (dd < 10)    sb.append("0");

sb.append(dd);

/** 음력 12월의 마지막날 (설날 첫번째 휴일)인지 확인 **/

if (mm == 12) {

int lastDate = chinaCal.getActualMaximum(ChineseCalendar.DAY_OF_MONTH);

if (dd == lastDate) {

return true;

}

}

for (String d : lunarArr) {

if (sb.toString().equals(d)) {

return true;

}

}

return result;

}


/**

 * 해당일자가 양력 법정공휴일에 해당하는 지 확인

 * @param date

 * @return

 */

private boolean isHolidaySolar (String date) {

boolean result = false;


if (StringUtil.nvl(date).equals("") || 

StringUtil.nvl(date).length() > 8) {

date = new java.text.SimpleDateFormat("MMdd").format(cal.getTime());

} else {

date = date.substring(4);

}

for (String d : solarArr) {

if (date.equals(d)) {

return true;

}

}

return result;

}

/**

 * 해당일자가 일요일인지 확인

 * @param date

 * @return

 */

private boolean isSunday (String date) {

boolean result = false;

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)));

if (cal.get ( Calendar.DAY_OF_WEEK ) == 1) {

result = true;

}

return result;

}


public String getDelvDate () {

int addDay = 1;

String date = "";

cal.setTime(new java.util.Date(System.currentTimeMillis())); 

cal.add(Calendar.DATE, addDay);

date = new java.text.SimpleDateFormat("yyyyMMdd").format(cal.getTime());


boolean result = true;

/** 양력 법정공휴일부터 확인 **/

result = isHolidaySolar(date);

/** 양력 법정공휴일에 해당하지 않으면 **/

if (!result) {

/** 음력 법정공휴일에 해당하는 지 확인 **/

result = isHolidayLunar(date);

/** 음력 공휴일에 해당하면 **/

if (result) {

/** 재조정된 값이 음력, 양력 공휴일 및 일요일에 해당하지 않을 때까지 루프 **/

while (result) {

cal.add(Calendar.DATE, addDay);

date = new java.text.SimpleDateFormat("yyyyMMdd").format(cal.getTime());

result = isHolidayLunar(date);

/** 음력 공휴일에도 해당하지 않을 경우 

* 이 때의 date가 일요일 및 양력 공휴일에 해당하는 지 한번 더 확인하고 일요일인지도 확인

*  **/

if (!result) {

result = isHolidaySolar(date);

}

if (!result) {

result = isSunday(date);

}

}

/** 양력 및 음력 공휴일에 해당하지 않으면 **/

} else {

/** 양력 및 음력 공휴일에 해당하지 않으므로 일요일인지 확인 **/

result = isSunday(date);

if (result) {

/** 재조정된 값이 음력, 양력 공휴일 및 일요일에 해당하지 않을 때까지 루프 **/

while (result) {

cal.add(Calendar.DATE, addDay);

date = new java.text.SimpleDateFormat("yyyyMMdd").format(cal.getTime());

result = isSunday(date);

/** 재조정된 값이 양력 및 음력 공휴일에 해당하는 지 확인 **/

if (!result) {

result = isHolidaySolar(date);

}

if (!result) {

result = isHolidayLunar(date);

}

}

}

}

} else { // 양력 공휴일에 해당하면 

/** 재조정된 값이 음력, 양력 공휴일 및 일요일에 해당하지 않을 때까지 루프 **/

while (result) {

cal.add(Calendar.DATE, addDay);

date = new java.text.SimpleDateFormat("yyyyMMdd").format(cal.getTime());

result = isHolidaySolar(date);

if (!result) {

result = isHolidaySolar(date);

}

if (!result) {

result = isSunday(date);

}

}

}

return date;

}


public static void main(String[] args) {

DateUtil du = new DateUtil();

du.getDelvDate();


}


참고 사이트 : http://yysvip.tistory.com/159

728x90