package com.eactive.eai.common.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.SimpleTimeZone;
import java.util.TimeZone;


/**
 * 1. 기능 : Date, Time 관련 Utility Method 정의
 * 2. 처리 개요 :
 *
 * 3. 주의사항
 *
 * @author  :
 * @version : v 1.0.0
 * @see :
 * @since   :
 */
public final class DatetimeUtil {

	private static final ThreadLocal<SimpleDateFormat> SDF_YYYYMMDD = new ThreadLocal<SimpleDateFormat>() {
		@Override
		protected SimpleDateFormat initialValue() {
			return new SimpleDateFormat( "yyyyMMdd");
		}
	};
	
	private static final ThreadLocal<SimpleDateFormat>	SDF_YYYYMMDD_DASH = new ThreadLocal<SimpleDateFormat>() {
		@Override
		protected SimpleDateFormat initialValue() {
			return new SimpleDateFormat( "yyyy-MM-dd");
		}
	};
	
	private static final ThreadLocal<SimpleDateFormat> 	SDF_YYYYMMDDHHMMSS = new ThreadLocal<SimpleDateFormat>() {
		@Override
		protected SimpleDateFormat initialValue() {
			return new SimpleDateFormat( "yyyyMMddHHmmss");
		}
	};
	private static final ThreadLocal<SimpleDateFormat>	SDF_YYYYMMDDHHMMSS_NO_MARK = new ThreadLocal<SimpleDateFormat>() {
		@Override
		protected SimpleDateFormat initialValue() {
			return new SimpleDateFormat( "yyyyMMddHHmmss");
		}
	};
    private static final ThreadLocal<SimpleDateFormat>  SDF_YYYYMMDDHHMMSSMS_NO_MARK = new ThreadLocal<SimpleDateFormat>() {
		@Override
		protected SimpleDateFormat initialValue() {
			return new SimpleDateFormat( "yyyyMMddHHmmssSSS" );
		}
	};
    private static final ThreadLocal<SimpleDateFormat>  SDF_HHMMSS_NO_MARK = new ThreadLocal<SimpleDateFormat>() {
		@Override
		protected SimpleDateFormat initialValue() {
			return new SimpleDateFormat( "HHmmss" );
		}
	};
    private static final ThreadLocal<SimpleDateFormat>  SDF_HHMMSSMS_CEMI_COL = new ThreadLocal<SimpleDateFormat>() {
		@Override
		protected SimpleDateFormat initialValue() {
			return new SimpleDateFormat( "HH:mm:ss.SSS" );
		}
	};
    private static final ThreadLocal<SimpleDateFormat>  SDF_YYYYMMDDHHMMSSMS_DASH_CEMI_COL = new ThreadLocal<SimpleDateFormat>() {
		@Override
		protected SimpleDateFormat initialValue() {
			return new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss.SSS" );
		}
	};
    private static final ThreadLocal<SimpleDateFormat>  SDF_YYYYMMDDHHMMSSSS_NO_MARK = new ThreadLocal<SimpleDateFormat>() {
		@Override
		protected SimpleDateFormat initialValue() {
			return new SimpleDateFormat( "yyyyMMddHHmmssSSS" );
		}
	};

    private static final String DATE_SEP = "-";
    private static String TIME_SEP = ":";
    private static final String DAY[] = {
        "\uC77C", "\uC6D4", "\uD654", "\uC218", "\uBAA9", "\uAE08", "\uD1A0"
    };

    /**
     * Private 생성자
     * Instance를 생성하지 못함
     */
    private DatetimeUtil()
    {

    }
   
	/**
	* 1. 기능 : 현재시간을 yyyyMMddHHmmssSS 형태로 변환
	* 2. 처리 개요 :
	*    - currentmilisec 를 입력받아 yyyyMMddHHmmssSS 형태로 변환한다.
	* 3. 주의사항
	*
	* @param    timeLong 현재시간 Long
	* @return String
	* @exception
	**/

    public static String getCurrentTime(long timeLong)
    {
        // 1hour(ms) = 60s * 60m * 1000ms
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        sdf.setTimeZone(new SimpleTimeZone(9 * 60 * 60 * 1000, "KST"));
        return sdf.format(new java.util.Date(timeLong));
    } // end of getCurrentTime()


	/**
	* 1. 기능 : 현재시간 스트링을 YYYYMMDDHHMMSSsss 형식으로 1/1000초까지 얻을 수 있는 Method
	* 2. 처리 개요 :
	*    - 현재시간을 yyyyMMddHHmmssSS 형태로 변환한다.
	* 3. 주의사항
	*
	* @return  1/1000까지 표시한 현재 시간 스트링(예: 20040920162110999)
	* @exception
	**/

    public static java.lang.String getCurrentTimeMillis() { //  1/1000 sec.
        return (SDF_YYYYMMDDHHMMSSMS_NO_MARK.get()).format(new java.util.Date());
    }


	/**
	* 1. 기능 : 현재날짜 스트링을 YYYYMMDD 형식으로 얻는 Method
	* 2. 처리 개요 :
	*    - 현재시간을 yyyyMMddHHmmssSS 형태로 변환한다.
	* 3. 주의사항
	*
	* @return 년월만 표시한 현재 날짜 스트링(예: 20040920)
	* @exception
	**/
    public static java.lang.String getCurrentDate() {
        return (SDF_YYYYMMDD.get()).format(new java.util.Date());
    }
	/**
	* 1. 기능 : 현재날짜 스트링을 YYYY-MM-DD 형식으로 얻는 Method
	* 2. 처리 개요 :
	*    - 현재시간을 yyyyMMddHHmmssSS 형태로 변환한다.
	* 3. 주의사항
	*
	* @return 년월만 표시한 현재 날짜 스트링(예: 20040920)
	* @exception
	**/
    public static java.lang.String getCurrentDateDash() {
        return (SDF_YYYYMMDD_DASH.get()).format(new java.util.Date());
    }
    
    public static java.lang.String getCurrentDateDash(long timeLong) {
    	return (SDF_YYYYMMDD_DASH.get()).format(new java.util.Date(timeLong));
    }
    
	/**
	* 1. 기능 : 현재시간을 시분초 형식의 스트링으로 얻는 Method
	* 2. 처리 개요 :
	*    - 현재시간을 yyyyMMddHHmmssSS 형태로 변환한다.
	* 3. 주의사항
	*
	* @return 시분초만 표시한 현재 시간 스트링(예: 162027)
	* @exception
	**/
    public static java.lang.String getCurrentTime() {
        return (SDF_HHMMSS_NO_MARK.get()).format(new java.util.Date());
    }

	/**
	* 1. 기능 : 현재부터 n분후의 시간 스트링(HHMMSS)을 얻는 Method
	* 2. 처리 개요 :
	*    - 현재의 시간에서 min분 후의 시간을 리턴한다. (HHMMSS)
	* 3. 주의사항
	*
	*	@param min 리턴하게 될 다음시간까지의 간격(분)
	*	@return 시분초만 표시한 시간 스트링(예: 162027)
	* @exception
	**/
    public static java.lang.String getNextTime(int min) {
        return (SDF_HHMMSS_NO_MARK.get()).format( new java.util.Date( System.currentTimeMillis() + min * 60 * 1000L ) );
    }

	/**
	* 1. 기능 : 현재 날짜시간 스트링을 년월일시분초로 가져오는 Method
	* 2. 처리 개요 :
	*    - 현재 날짜시간 스트링을 년월일시분초로 가져오는 Method
	* 3. 주의사항
	*
	*	@return 년월일시분초 시간 스트링(예: 20040921194425)
	* @exception
	**/
    public static java.lang.String getCurrentDateTime() {
        return (SDF_YYYYMMDDHHMMSS.get()).format(new java.util.Date());
    }

	/**
	* 1. 기능 : 현재 날짜시간 스트링을 년월일시분초1/1000초로 가져오는 Method
	* 2. 처리 개요 :
	*    - 현재 날짜시간 스트링을 년월일시분초1/1000초로 가져오는 Method
	* 3. 주의사항
	*
	*	@return 년월일시분초1/100 시간 스트링(예: 20040921194425125)
	* @exception
	**/
    public static java.lang.String getCurrentTimeCenti() {
        return (SDF_YYYYMMDDHHMMSSMS_NO_MARK.get()).format(new java.util.Date()).substring(0,16);
    }

	/**
	* 1. 기능 : 시:분:초.1/1000초형식으로 현재시간을 가져오는 Method
	* 2. 처리 개요 :
	*    - 시:분:초.1/1000초형식으로 현재시간을 가져오는 Method
	* 3. 주의사항
	*
	* @return 시:분:초.1/1000초 스트링(예: 19:46:27.053)
	* @exception
	**/
    public static String getTimeStamp() {
        return (SDF_HHMMSSMS_CEMI_COL.get()).format(new java.util.Date());
    }

	/**
	* 1. 기능 : 로그시 쓰기위해 "년-월-일 시:분:초.1/1000초" 형식으로 현재시간을 가져오는 Method
	* 2. 처리 개요 :
	*    - 로그시 쓰기위해 "년-월-일 시:분:초.1/1000초" 형식으로 현재시간을 가져오는 Method
	* 3. 주의사항
	*
	* @return "년-월-일 시:분:초.1/1000"초 스트링(예: 2004-09-21 19:46:27.053)
	* @exception
	**/
    public static String getLogTimeStamp() {
        return (SDF_YYYYMMDDHHMMSSMS_DASH_CEMI_COL.get()).format(new java.util.Date());
    }

    public static long getTimeInMillis(String yyyymmdd) {
        if ( yyyymmdd.length() != 8) return -1;

        Calendar calendar = Calendar.getInstance();
        calendar.set(Integer.parseInt(yyyymmdd.substring(0,4)),Integer.parseInt(yyyymmdd.substring(4,6))-1,Integer.parseInt(yyyymmdd.substring(6)));

        return calendar.getTimeInMillis();
    }
    
	/**
	* 1. 기능 : mmdd, yyyymmdd 형식의 날짜가 올바른지 검사하는 Method
	* 2. 처리 개요 :
	*    - mmdd, yyyymmdd 형식의 날짜가 올바른지 검사하는 Method
	* 3. 주의사항
	*
	* @param date 스트링형태의 날짜( mmdd 또는 yyyymmdd )
	* @return 올바른 날짜이면 true, 올바르지 않은 날짜이면 false
	* @exception
	**/
    public static boolean isRightDate(String date) {
        int len = date.length();
        if( len != 4 && len != 8 ) return false;
        String sdate = null;
        if ( len == 4 ) {
            sdate = getCurrentDate().substring(0, 4) + "-" + date.substring(0,2) + "-" + date.substring(2);
        } else {
            sdate = date.substring(0,4) + "-" + date.substring(4,6) + "-" + date.substring(6);
        }

        java.sql.Date dt = null;
        try {
            dt = java.sql.Date.valueOf(sdate);
        } catch (Exception e) {
            return false;
        }

        if ( dt.toString().equals(sdate) ) return true;
        else return false;
    }

	/**
	* 1. 기능 : 현재일의 다음일자를 리턴하는 Method
	* 2. 처리 개요 :
	*    - 현재시간을 yyyyMMddHHmmssSS 형태로 변환한다.
	* 3. 주의사항
	*
	* @return 현재일의 다음날짜 스트링
	* @exception
	**/
    public static String getNextDate() {
        return getDayAddedDate( getCurrentDate(), 1 );
    }

	/**
	* 1. 기능 : 지정일의 day일 후 일자를 리턴하는 Method
	* 2. 처리 개요 :
	*    - 지정일의 day일 후 일자를 리턴하는 Method
	* 3. 주의사항
	*
	* @param yyyymmdd 'yyyymmdd' 스트링형태의 지정일
    * @param day 지정일로부터 더할 날수
	* @return 지정일에 day일을 더한 날짜 스트링( yyyymmdd ) 8자리 날짜가 아니면 입력한 지정일 리턴
	* @exception
	**/
    public static String getDayAddedDate(String yyyymmdd, int day) {
        if ( yyyymmdd.length() != 8) return yyyymmdd;

        Calendar calendar = Calendar.getInstance();
        calendar.set(Integer.parseInt(yyyymmdd.substring(0,4)),Integer.parseInt(yyyymmdd.substring(4,6))-1,Integer.parseInt(yyyymmdd.substring(6))+day);

        return (SDF_YYYYMMDD.get()).format(calendar.getTime());
    }
    
    /**
	* 1. 기능 : 지정일의 day일 후 일자를 리턴하는 Method2
	* 2. 처리 개요 :
	*    - 지정일의 day일 후 일자를 리턴하는 Method (기존 Method 보존하고 .add()로 신규 처리)
	* 3. 주의사항
    * 
    * @param yyyymmdd 'yyyymmdd' 스트링형태의 지정일
    * @param day 지정일로부터 더할 날수
    * @return 지정일에 day일을 더한 날짜 스트링( yyyymmdd ) 8자리 날짜가 아니거나 날짜형식에 맞지 않으면 입력한 지정일 리턴
    * @exception
    **/
    public static String getDayAddedDate2(String yyyymmdd, int day) {
        if ( yyyymmdd.length() != 8) return yyyymmdd;

        Calendar calendar = Calendar.getInstance();
        //calendar.set(Integer.parseInt(yyyymmdd.substring(0,4)),Integer.parseInt(yyyymmdd.substring(4,6))-1,Integer.parseInt(yyyymmdd.substring(6))+day);
		try {
			Date dt = (SDF_YYYYMMDD.get()).parse(yyyymmdd);
			calendar.setTime(dt);
	        calendar.add(Calendar.DATE, day);
		} catch (ParseException e) {
			return yyyymmdd;
		}
		return (SDF_YYYYMMDD.get()).format(calendar.getTime());
    }

	/**
	* 1. 기능 : 지정일의 month월 후 일자를 리턴하는 Method
	* 2. 처리 개요 :
	*    - 지정일의 month월 후 일자를 리턴하는 Method
	* 3. 주의사항
	*
	* @param yyyymmdd 'yyyymmdd' 스트링형태의 지정일
    * @param month 지정일로부터 더할 월수
	* @return 지정일에 month월을 더한 날짜 스트링( yyyymmdd ) 8자리 날짜가 아니거나 날짜형식에 맞지 않으면 입력한 지정일 리턴
	* @exception
	**/
    public static String getMonthAddedDate(String yyyymmdd, int month) {
        if ( yyyymmdd.length() != 8) return yyyymmdd;
        
        Calendar calendar = Calendar.getInstance();
        //calendar.set(Integer.parseInt(yyyymmdd.substring(0,4)),Integer.parseInt(yyyymmdd.substring(4,6))-1+month,Integer.parseInt(yyyymmdd.substring(6)));
        try {
			Date dt = (SDF_YYYYMMDD.get()).parse(yyyymmdd);
			calendar.setTime(dt);
	        calendar.add(Calendar.MONTH, month);
		} catch (ParseException e) {
			return yyyymmdd;
		}

        return (SDF_YYYYMMDD.get()).format(calendar.getTime());
    }

	/**
	* 1. 기능 : 지정일의 year년 후 일자를 리턴하는 Method
	* 2. 처리 개요 :
	*    - 지정일의 year년 후 일자를 리턴하는 Method
	* 3. 주의사항
	*
	* @param yyyymmdd 'yyyymmdd' 스트링형태의 지정일
    * @param year 지정일로부터 더할 년수
	* @return 지정일에 year년을 더한 날짜 스트링( yyyymmdd ) 8자리 날짜가 아니거나 날짜형식에 맞지 않으면 입력한 지정일 리턴
	* @exception
	**/
    public static String getYearAddedDate(String yyyymmdd, int year) {
        if ( yyyymmdd.length() != 8) return yyyymmdd;

        Calendar calendar = Calendar.getInstance();
        //calendar.set(Integer.parseInt(yyyymmdd.substring(0,4))+year,Integer.parseInt(yyyymmdd.substring(4,6))-1,Integer.parseInt(yyyymmdd.substring(6)));
        try {
			Date dt = (SDF_YYYYMMDD.get()).parse(yyyymmdd);
			calendar.setTime(dt);
			calendar.add(Calendar.YEAR, year);
		} catch (ParseException e) {
			return yyyymmdd;
		}
        
        return (SDF_YYYYMMDD.get()).format(calendar.getTime());
    }

	/**
	* 1. 기능 : 지정일의 year년month월day일 후 일자를 리턴하는 Method
	* 2. 처리 개요 :
	*    - 지정일의 year년month월day일 후 일자를 리턴하는 Method
	* 3. 주의사항
	*
	* @param yyyymmdd 'yyyymmdd' 스트링형태의 지정일
    * @param year 지정일로부터 더할 년수
    * @param month 지정일로부터 더할 월수
    * @param day 지정일로부터 더할 날수
	* @return 지정일에 year년month월day일을 더한 날짜 스트링( yyyymmdd ) 8자리 날짜가 아니거나 날짜형식에 맞지 않으면 입력한 지정일 리턴
	* @exception
	**/
    public static String getDateAddedDate(String yyyymmdd, int year, int month, int day) {
        if ( yyyymmdd.length() != 8) return yyyymmdd;

        Calendar calendar = Calendar.getInstance();
        //calendar.set(Integer.parseInt(yyyymmdd.substring(0,4))+year,Integer.parseInt(yyyymmdd.substring(4,6))-1+month,Integer.parseInt(yyyymmdd.substring(6))+day);
        try {
			Date dt = (SDF_YYYYMMDD.get()).parse(yyyymmdd);
			calendar.setTime(dt);
			calendar.add(Calendar.YEAR, year);
	        calendar.add(Calendar.MONTH, month);
	        calendar.add(Calendar.DATE, day);
		} catch (ParseException e) {
			return yyyymmdd;
		}

        return (SDF_YYYYMMDD.get()).format(calendar.getTime());
    }



	/**
	* 1. 기능 : 형식화된 Date 문자열 리턴하는 메서드
	* 2. 처리 개요 :
	*    - format은 "YYYYMMDD" 등 자바에서 지원하는 date format을 사용.format의 길이만큼 잘라서 리턴함.
	* 3. 주의사항
	*
	* @param format "YYYY-MM-DD HH:mm:ss.SSS", SSS는 밀리세컨드 단위
    * @param day 변환 대상 일자
    * @return 형식화된 date 문자열
	* @exception
	**/
    public static String getFormattedDate( String format, java.util.Date day )
    {
        /*
        Calendar labelDay = Calendar.getInstance();
        DateFormat df = DateFormat.getDateInstance();
        java.util.Date sDate = df.parse(startLabel);
        labelDay.setTime(sDate);
        */
        if ( day == null || format == null )
            return "";
        SimpleDateFormat formatter  = new SimpleDateFormat (format);
        String result = formatter.format(day);
        if ( result.length() > format.length() )
            result = result.substring( 0, format.length() );
        return  result;
    }

    /**
	* 1. 기능 : 문자열을 boolean으로 변환하는 메서드
	* 2. 처리 개요 :
	*    - 문자열을 boolean으로 변환하는 메서드
	* 3. 주의사항
	*
	* @param booleanStr boolean을 뜻하는 문자
    * @return booleanStr이 나타내는 boolean 값
    *         true : booleanStr이 "Y", "y", "1" 일 경우
    *         false : booleanStr이 "N", "n", "0" 일 경우
	* @exception
	**/
    public static boolean getBooleanValue( String booleanStr )
    {
        if ( booleanStr.equalsIgnoreCase( "Y" ) ||
        		booleanStr.equalsIgnoreCase( "1" ) )
            return true;
        else if ( booleanStr.equalsIgnoreCase( "N" ) ||
        		booleanStr.equalsIgnoreCase( "0" ) )
            return false;
        else return false;
    }

    /**
	* 1. 기능 : 시작/끝 시간을 System.out.currentTimeMillis()의 결과로 세팅할 때 경과된 시간을 리턴하는 Method
	* 2. 처리 개요 :
	*    - 시작/끝 시간을 System.out.currentTimeMillis()의 결과로 세팅할 때 경과된 시간을 리턴
	* 3. 주의사항
	*
	* @param start 시작시간(milli second 단위)
    * @param end 종료시간(milli second 단위)
    * @return 경과 시간(second 단위)
	* @exception
	**/
    public static float getElapsedTime( long start, long end )
    {
        return (float)(end - start)/(float)1000;
    }

    /**
	* 1. 기능 : 년, 월, 일을 숫자로 리턴하는 함수를 위해 주어진 패턴별로 날짜를 숫자로 리턴하는 Method
	* 2. 처리 개요 :
	*    - 년, 월, 일을 숫자로 리턴하는 함수를 위해 주어진 패턴별로 날짜를 숫자로 리턴
	* 3. 주의사항
	*
	* @param pattern 년(yyyy),월(MM),일(dd)에 해당하는 패턴
    * @return 해당 pattern에 맞는 숫자값
	* @exception
	**/
    private static int getNumberByPattern(String pattern)
    {
        SimpleDateFormat formatter = new SimpleDateFormat(pattern, Locale.KOREA);
        String dateString = formatter.format(new Date());
        return Integer.parseInt(dateString);
    }

	/**
	* 1. 기능 : 현재 년도를 숫자로 리턴하는 Method
	* 2. 처리 개요 :
	*    - 현재 년도를 숫자로 리턴
	* 3. 주의사항
	*
	* @return 현재 년도 숫자
	* @exception
	**/
    public static int getYear()
    {
        return getNumberByPattern("yyyy");
    }

	/**
	* 1. 기능 : 현재 월을 숫자로 리턴하는 Method
	* 2. 처리 개요 :
	*    - 현재 월을 숫자로 리턴하는 Method
	* 3. 주의사항
	*
	* @return 현재 월 숫자
	* @exception
	**/
    public static int getMonth()
    {
        return getNumberByPattern("MM");
    }

	/**
	* 1. 기능 : 현재 일을 숫자로 리턴하는 Method
	* 2. 처리 개요 :
	*    - 현재 일을 숫자로 리턴하는 Method
	* 3. 주의사항
	*
	* @return 현재 일 숫자
	* @exception
	**/
    public static int getDay()
    {
        return getNumberByPattern("dd");
    }

	/**
	* 1. 기능 : 현재 요일을 문자로 리턴하는 Method
	* 2. 처리 개요 :
	*    - 현재 요일을 문자로 리턴하는 Method
	* 3. 주의사항
	*
	* @return 현재 요일 문자
	* @exception
	**/
    public static String getDayOfWeek()
    {
        Calendar c = Calendar.getInstance();
        return DAY[c.get(7) - 1];
    }

	/**
	* 1. 기능 : 현재 시간 중 시에 해당하는 숫자를 리턴하는 Method
	* 2. 처리 개요 :
	*    - 현재 시간 중 시에 해당하는 숫자를 리턴하는 Method
	* 3. 주의사항
	*
	* @return 현재 시 숫자
	* @exception
	**/
    public static int getHour()
    {
        Calendar c = Calendar.getInstance();
        return c.get(11);
    }

	/**
	* 1. 기능 : 현재 시간 중 분에 해당하는 숫자를 리턴하는 Method
	* 2. 처리 개요 :
	*    - 현재 시간 중 분에 해당하는 숫자를 리턴하는 Method
	* 3. 주의사항
	*
	* @return 현재 분 숫자
	* @exception
	**/
    public static int getMinute()
    {
        Calendar c = Calendar.getInstance();
        return c.get(12);
    }

	/**
	* 1. 기능 : 현재 시간 중 초에 해당하는 숫자를 리턴하는 Method
	* 2. 처리 개요 :
	*    - 현재 시간 중 초에 해당하는 숫자를 리턴하는 Method
	* 3. 주의사항
	*
	* @return 현재 초 숫자
	* @exception
	**/
    public static int getSecond()
    {
        Calendar c = Calendar.getInstance();
        return c.get(13);
    }

	/**
	* 1. 기능 : 현재 날짜 스트링을 리턴하는 Method
	* 2. 처리 개요 :
	*    - 현재 날짜 스트링을 리턴하는 Method
	* 3. 주의사항
	*
	* @return 날짜 스트링( YYYY-MM-DD )
	* @exception
	**/
    public static String getDateString()
    {
        return getYear() + DATE_SEP + getMonth() + DATE_SEP + getDay();
    }

	/**
	* 1. 기능 : 현재 날짜 스트링을 주어진 분리자를 이용하여 리턴하는 Method
	* 2. 처리 개요 :
	*    - 현재 날짜 스트링을 주어진 분리자를 이용하여 리턴하는 Method
	* 3. 주의사항
	*
    * @param sep 분리자
    * @return 분리자가 포함된 날짜 스트링
	* @exception
	**/
    public static String getDateString(String sep)
    {
        return getYear() + sep + getMonth() + sep + getDay();
    }

    /**
	* 1. 기능 : 현재 시간 스트링을 리턴하는 Method
	* 2. 처리 개요 :
	*    - 현재 시간 스트링을 리턴하는 Method
	* 3. 주의사항
	*
	* @return 현재 시간 스트링( HH:mm:ss )
	* @exception
	**/
    public static String getTimeString()
    {
        String hour = getHour() + "";
        String min = getMinute() + "";
        String sec = getSecond() + "";
        if(hour.length() == 1)
            hour = "0" + hour;
        if(min.length() == 1)
            min = "0" + min;
        if(sec.length() == 1)
            sec = "0" + sec;
        return hour + TIME_SEP + min + TIME_SEP + sec;
    }
	/**
	* 1. 기능 : 현재 일시 스트링을 리턴하는 Method
	* 2. 처리 개요 :
	*    - 현재 일시 스트링을 리턴하는 Method
	* 3. 주의사항
	*
	* @return 현재 일시 스트링( YYYY-MM-DD HH:mm:ss )
	* @exception
	**/
    public static String getTimeStampString()
    {
        return getDateString(DATE_SEP) + " " + getTimeString();
    }

	/**
	* 1. 기능 : 현재 일시 스트링을 분까지 리턴하는 Method
	* 2. 처리 개요 :
	*    - 현재 일시 스트링을 분까지 리턴하는 Method
	* 3. 주의사항
	*
	* @return 현재 일시 스트링 ( YYYYMMDDHHmm )
	* @exception
	**/
    public static String getDate_Time_Min()
    {
        String month = getMonth() + "";
        String day = getDay() + "";
        String hour = getHour() + "";
        String min = getMinute() + "";
        if(month.length() == 1)
            month = "0" + month;
        if(day.length() == 1)
            day = "0" + day;
        if(hour.length() == 1)
            hour = "0" + hour;
        if(min.length() == 1)
            min = "0" + min;
        return getYear() + "" + month + "" + day + "" + hour + "" + min;
    }

	/**
	* 1. 기능 : 현재 일시 스트링을 초까지 리턴하는 Method
	* 2. 처리 개요 :
	*    - 현재 일시 스트링을 초까지 리턴하는 Method
	* 3. 주의사항
	*
	* @return 현재 일시 스트링 ( YYYYMMDDHHmmss )
	* @exception
	**/
    public static String getDateTimeString()
    {
        String month = getMonth() + "";
        String day = getDay() + "";
        String hour = getHour() + "";
        String min = getMinute() + "";
        String sec = getSecond() + "";
        if(month.length() == 1)
            month = "0" + month;
        if(day.length() == 1)
            day = "0" + day;
        if(hour.length() == 1)
            hour = "0" + hour;
        if(min.length() == 1)
            min = "0" + min;
        if(sec.length() == 1)
            sec = "0" + sec;
        return getYear() + "" + month + "" + day + "" + hour + "" + min + sec;
    }

	/**
	* 1. 기능 : 14자리 일시 문자열을 분리자가 있는 날짜 스트링으로 바꾸어 리턴하는 Method
	* 2. 처리 개요 :
	*    - 14자리 일시 문자열을 분리자가 있는 날짜 스트링으로 바꾸어 리턴하는 Method
	* 3. 주의사항
	*
	* @param dateTime 8자리 일시 문자열( YYYYMMDD )
    * @return "-" 분리자가 포함된 일시 문자열 ( YYYY-MM-DD )
	* @exception
	**/
    public static String parseDate(String dateTime)
    {
        String year = dateTime.substring(0, 4);
        String month = dateTime.substring(4, 6);
        String day = dateTime.substring(6, 8);
        return year + "-" + month + "-" + day;
    }

	/**
	* 1. 기능 : 주어진 년이 윤년인지 아닌지 리턴하는 Method
	* 2. 처리 개요 :
	*    - 주어진 년이 윤년인지 아닌지 리턴하는 Method
	* 3. 주의사항
	*
	* @param year 검사 대상 년도
    * @return 유년 여부
    * 	true : 윤년
    * 	false : 윤년이 아님
	* @exception
	**/
    public static boolean checkEmbolism(int year)
    {
        int remain = 0;
        int remain_1 = 0;
        int remain_2 = 0;
        remain = year % 4;
        remain_1 = year % 100;
        remain_2 = year % 400;
        if(remain == 0)
        {
            if(remain_1 == 0)
                return remain_2 == 0;
            else
                return true;
        } else
        {
            return false;
        }
    }

	/**
	* 1. 기능 : 년도와 월로 입력한 월의 일수를 리턴하는 Method
	* 2. 처리 개요 :
	*    - 년도와 월로 입력한 월의 일수를 리턴하는 Method
	* 3. 주의사항
	*
	* @param year 년도
    * @param month 월
    * @return 입력한 월에 해당하는 일수
	* @exception
	**/
    public static int getMonthDate(String year, String month)
    {
        int dateMonth[] = new int[12];
        dateMonth[0] = 31;
        dateMonth[1] = 28;
        dateMonth[2] = 31;
        dateMonth[3] = 30;
        dateMonth[4] = 31;
        dateMonth[5] = 30;
        dateMonth[6] = 31;
        dateMonth[7] = 31;
        dateMonth[8] = 30;
        dateMonth[9] = 31;
        dateMonth[10] = 30;
        dateMonth[11] = 31;
        if(checkEmbolism(Integer.parseInt(year)))
            dateMonth[1] = 29;
        int day = dateMonth[Integer.parseInt(month) - 1];
        return day;
    }
 	/**
	* 1. 기능 : 년월일시분초를 넣으면 특정일 앞이나 뒤로 이동해서 리턴하는 Method
	* 2. 처리 개요 :
	*    - 년월일시분초를 넣으면 특정일 앞이나 뒤로 이동해서 리턴하는 Method
	* 3. 주의사항
	*
	* @param sourceDate YYYYMMDDHHMMSS
        * @param moveDay  몇일
        * @return YYYYMMDDHHMMSSSS
	* @exception
	**/
    public static String getDateMove(String sourceDate, int moveDay)
    {
        try{
            Date srcDate;
            Date resultDate;

            srcDate= SDF_YYYYMMDDHHMMSS_NO_MARK.get().parse(sourceDate);
            Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT+09:00"),Locale.KOREA);
            calendar.setTime (srcDate);
            calendar.roll(Calendar.DATE , moveDay );
            resultDate = calendar.getTime();

            return SDF_YYYYMMDDHHMMSSSS_NO_MARK.get().format(resultDate);
        }catch(Exception e){
            return null;
        }
    }

	//static { SDF_YYYYMMDD.setLenient(false); }
	public static boolean isDateValue(String srcValue) {
		try { SDF_YYYYMMDD.get().parse(srcValue); } catch (Exception e) { return false; }
		return true;
	}
	//static { SDF_HHMMSS_NO_MARK.setLenient(false); }
	public static boolean isTimeValue(String srcValue) {
		try { SDF_HHMMSS_NO_MARK.get().parse(srcValue); } catch (Exception e) { return false; }
		return true;
	}

	/**
	 * yyyyMMdd 형식의 날짜에 days 만큼 날짜를 더한 yyyyMMdd 문자열을 얻는다. 
	 * 
	 * calendar add 함수로 다시 구현
	 * @param tempBaseDate yyyyMMdd 
	 * @param days 추가할 일수. -1 인 경우 전일자
	 * @return yyyyMMdd 형식
	 * @throws ParseException
	 */
	public synchronized static String addDays(String tempBaseDate, int days) throws ParseException {
        if ( tempBaseDate.length() != 8) return tempBaseDate;

        Calendar calendar = Calendar.getInstance();
        Date date = SDF_YYYYMMDD.get().parse(tempBaseDate);
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, days);

        return (SDF_YYYYMMDD.get()).format(calendar.getTime());
	}
}