import com.ibm.icu.util.ChineseCalendar; import com.tistory.link2me.item.Holidays;
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Collections;
public class LunarCalendar { static ArrayList<Holidays> holidaysArrayList = new ArrayList<>();
/** * 음력날짜를 양력날짜로 변환 * @param 음력날짜 (yyyyMMdd) * @return 양력날짜 (yyyyMMdd) */ public static String Lunar2Solar(String yyyymmdd) { ChineseCalendar cc = new ChineseCalendar(); Calendar cal = Calendar.getInstance();
if (yyyymmdd == null) return "";
String date = yyyymmdd.trim(); if (date.length() != 8) { if (date.length() == 4) date = date + "0101"; else if (date.length() == 6) date = date + "01"; else if (date.length() > 8) date = date.substring(0, 8); else return ""; }
cc.set(ChineseCalendar.EXTENDED_YEAR, Integer.parseInt(date.substring(0, 4)) + 2637); cc.set(ChineseCalendar.MONTH, Integer.parseInt(date.substring(4, 6)) - 1); cc.set(ChineseCalendar.DAY_OF_MONTH, Integer.parseInt(date.substring(6)));
cal.setTimeInMillis(cc.getTimeInMillis());
int y = cal.get(Calendar.YEAR); int m = cal.get(Calendar.MONTH) + 1; int d = cal.get(Calendar.DAY_OF_MONTH);
StringBuffer ret = new StringBuffer(); ret.append(String.format("%04d", y)); ret.append(String.format("%02d", m)); ret.append(String.format("%02d", d));
return ret.toString(); }
/** * 양력날짜를 음력날짜로 변환 * @param 양력날짜 (yyyyMMdd) * @return 음력날짜 (yyyyMMdd) */ public static String Solar2Lunar(String yyyymmdd) { ChineseCalendar cc = new ChineseCalendar(); Calendar cal = Calendar.getInstance();
if (yyyymmdd == null) return "";
String date = yyyymmdd.trim() ; if( date.length() != 8 ) { if( date.length() == 4 ) date = date + "0101" ; else if( date.length() == 6 ) date = date + "01" ; else if( date.length() > 8 ) date = date.substring(0,8) ; else return "" ; }
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() ) ;
// ChinessCalendar.YEAR 는 1~60 까지의 값만 가지고 , // ChinessCalendar.EXTENDED_YEAR 는 Calendar.YEAR 값과 2637 만큼의 차이를 가진다. 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() ; if( y < 1000 ) ret.append( "0" ) ; else if( y < 100 ) ret.append( "00" ) ; else if( y < 10 ) ret.append( "000" ) ; ret.append( y ) ;
if( m < 10 ) ret.append( "0" ) ; ret.append( m ) ;
if( d < 10 ) ret.append( "0" ) ; ret.append( d ) ;
return ret.toString() ; }
public static ArrayList<Holidays> holidayArray(String yyyy){ holidaysArrayList.clear(); // 데이터 초기화 // 양력 휴일 addHolidaysItem(yyyy,"0101" ,"신정"); addHolidaysItem(yyyy,"0301" ,"삼일절"); addHolidaysItem(yyyy,"0505" ,"어린이날"); addHolidaysItem(yyyy,"0606" ,"현충일" ); addHolidaysItem(yyyy,"0815" ,"광복절"); addHolidaysItem(yyyy,"1003" ,"개천절"); addHolidaysItem(yyyy,"1009" ,"한글날"); addHolidaysItem(yyyy,"1225" ,"성탄절");
// 음력 휴일 String prev_seol = String.valueOf(Integer.parseInt(Lunar2Solar(yyyy+"0101")) -1); addHolidaysItem(yyyy,prev_seol.substring(4) ,""); addHolidaysItem(yyyy,SolarDays(yyyy, "0101"),"설날"); addHolidaysItem(yyyy,SolarDays(yyyy, "0102"),""); addHolidaysItem(yyyy,SolarDays(yyyy, "0408"),"석탄일"); addHolidaysItem(yyyy,SolarDays(yyyy, "0814"),""); addHolidaysItem(yyyy,SolarDays(yyyy, "0815"),"추석"); addHolidaysItem(yyyy,SolarDays(yyyy, "0816"),"");
try { // 어린이날 대체공휴일 검사 : 어린이날은 토요일, 일요일인 경우 그 다음 평일을 대체공유일로 지정 int childDayChk = WeekendValue(yyyy+"0505"); if(childDayChk == 1) addHolidaysItem(yyyy,"0506" ,"대체공휴일"); if(childDayChk == 7) addHolidaysItem(yyyy,"0507" ,"대체공휴일");
// 설날 대체공휴일 검사 if(WeekendValue(Lunar2Solar(yyyy+"0101"))==1) addHolidaysItem(yyyy,SolarDays(yyyy, "0103"),"대체공휴일"); if(WeekendValue(Lunar2Solar(yyyy+"0101"))==2) addHolidaysItem(yyyy,SolarDays(yyyy, "0103"),"대체공휴일"); if(WeekendValue(Lunar2Solar(yyyy+"0102"))==1) addHolidaysItem(yyyy,SolarDays(yyyy, "0103"),"대체공휴일");
// 추석 대체공휴일 검사 if(WeekendValue(Lunar2Solar(yyyy+"0814"))==1) addHolidaysItem(yyyy,SolarDays(yyyy, "0817"),"대체공휴일"); if(WeekendValue(Lunar2Solar(yyyy+"0815"))==1) addHolidaysItem(yyyy,SolarDays(yyyy, "0817"),"대체공휴일"); if(WeekendValue(Lunar2Solar(yyyy+"0816"))==1) addHolidaysItem(yyyy,SolarDays(yyyy, "0817"),"대체공휴일"); } catch (ParseException e) { e.printStackTrace(); }
Collections.sort(holidaysArrayList); // 오름차순 정렬
return holidaysArrayList; }
private static String SolarDays(String yyyy, String date){ return Lunar2Solar(yyyy+date).substring(4); }
private static void addHolidaysItem(String year, String date, String name ){ Holidays item = new Holidays(); item.setYear(year); item.setDate(date); item.setName(name); holidaysArrayList.add(item); }
private static int WeekendValue(String date) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); Calendar cal = Calendar.getInstance(); cal.setTime(sdf.parse(date)); return cal.get(Calendar.DAY_OF_WEEK); // Calendar.SUNDAY : 1 // Calendar.SATURDAY : 7 }
}
|