본문 바로가기

JAVA/날짜/시간

자바/Java Calendar ( 캘린더 ) 란 ?

자바/Java Calendar ( 캘린더 ) 란 ?

Calendar 란 날짜 관련 인스턴스 입니다.
달력이나 시간계산등을 사용 할 때 많이 쓰는 인스턴스 인데요. 어떻게 인스턴스를 생성하며 사용하는지 알아볼까요?

먼저 Calendar 객체를 얻기 위해서는 
Calendar calendar = Calendar.getInstance();
위와 같은 방법으로 인스턴스를 얻어 와야 합니다.
또한 getInstance() 메서드를 호출 하면 현재의 일짜와 시각으로 초기화가 되기 때문에 별도의 설정 작업 없이도 
calendar.getTime() 메서드로 현재 시간을 얻어 올 수 있습니다.

그럼 예문을 통해 좀 더 자세히 알아 보겠습니다.
    /**
	 * @explain HHmmss형태의 문자열을 Calendar 객체로 변환합니다.
	 * @param filename
	 * @param cuttime
	 * @return calendar 
	 */
    public static Calendar CalendarFromStringPlus(String filename , int cuttime)
    {
    	// 캘린더 인스턴스를 얻는다.
        Calendar calendar = Calendar.getInstance();
        try
        {
        	// SimpleDateFormat 객체로 매개변수로 받은 String 파일을 "HHmmss"형식으로
        	// 변환하고 캘린더 인스턴스에 넣어 시간으로 변환 할 수 있다.
            SimpleDateFormat formatter = new SimpleDateFormat("HHmmss");
            calendar.setTime(formatter.parse(filename));
            // 현재 셋팅된 시/분/초 에 + 매개변수로 받은 값을 더할 수 있다.
            calendar.add( calendar.HOUR, + cuttime ); 
            calendar.add( calendar.MINUTE, + cuttime );  
            calendar.add( calendar.SECOND, + cuttime );          
        } 
        catch(ParseException e)
        {
            e.printStackTrace();
        }
        // 오류 발생시에는 현재 셋팅된 초기 값으로 return 된다.
        return calendar;
    }

일반적으로 위와 같은 방법으로 많이 사용 하게 되는데요. 포맹팅된 시간에 시/분/초 시간등을 대입 하여 계산 할 수 있습니다. 그렇기 때문에 String 파일등을 시간으로 계산할 경우 가 생기면 매우 유용하게 계산 할 수 있겠죠?ㅎ
아니면 일일이 if조건을 걸고 예외처리를 해야 하는데 너무 힘들고 고단한(?) 작업 입니다.ㅎ

그럼 원하는 작업 후 리턴 받은 calendar 인스턴스를 다시 String으로 리턴 받고 싶은 경우는 어떻게 해야 될까요?

네 맞습니다 ㅎㅎ!! 다시 SimpleDateFormat 으로 포맷팅 해서 String으로 사용하면 됩니다.~!
간단하죠?ㅎ
    /**
     * @explain 캘린더 객체를 HHmmss형태의 문자열로 변환합니다.
     * @param calendar 캘린더 객체
     * @return 변환된 문자열
     */
    public static String StringSimpleFromCalendar(Calendar calendar)
    {
        // 날짜를 포맷팅 된 문자열로 변경 한다.
        SimpleDateFormat formatter = new SimpleDateFormat("HHmmss");
        return formatter.format(calendar.getTime());
    }

이렇게 사용 하시면 됩니다~!

그리고 아래는 캘런더에서 getTimeInMillis() 를 사용한 예제를 만들어 보았습니다.
   
class TestCalendar {

	/**
	 * @explain Calendar 테스트
	 */
	public void mTestCalendar() {

		// 현재 로직은 ( 현재 시간 + 300분 ) < ( 현재 시간 )을 비교하고 10초마다 +10를 하여 
		// 체크해서 300분후 로그를 찍는 로직 입니다.
		// 현재 시각이 204056(10시40분56초) 이고 300분을 calendar.add() 해준 경우,
		// 204056(10시40분56초)에서 300분이 넘어가게 되어 "HHmmss"형식에서는 014056(오전 
		// 01시40분56초)로 보여 지지만, 실제로는 dd 일수가 +1 증가 하게 됩니다.
		// 그렇기 때문에 calendar.getTimeInMillis() 메서드를 이용하면 현재 날짜와 시간을
		// 밀리초로 바꿔서 반환해 주기때문에 편리하게 계산 할 수 있습니다.
		// 그리고 계산이 끝난 후에는 다시 Time() 형식으로 변환이 가능 합니다.

		// 현재 날짜 시간 + 300분이 더 해진다.
		Calendar calendarAfter30 = Calendar.getInstance();
		calendarAfter30.add( calendarAfter30.MINUTE, 300 );

		// SimpleDateFormat 을 이용하여 "HHmmss"형식에 맞게 현재시간에 300분을 
		// 더한 시간을 얻어올수 있다.
		SimpleDateFormat formatter = new SimpleDateFormat("HHmmss");
        String getAfter30Time = formatter.format(calendarAfter30.getTime());
    	Log.d( "WAHTUP", "getAfter30Time = " + getAfter30Time ); 
		Log.d( "WAHTUP", "calendarAfter30.getTimeInMillis(); = " + calendarAfter30.getTimeInMillis() );

		// "HHmmss"형식을 "yyyyMMddHHmmss"으로 다시 바꿀 수 있다.
		SimpleDateFormat formatterDay = new SimpleDateFormat("yyyyMMddHHmmss");
		String getNowTimeDay = formatterDay.format(calendarAfter30.getTime());
		Log.d( "WAHTUP", "DAY getAfter30NowTime = " + getNowTimeDay ); 
		Log.d( "WAHTUP", "DAY calendarAfter30.getTimeInMillis(); = " + calendarAfter30.getTimeInMillis() );

		// 밀리초를 다시 "HHmmss" 형식의 Time 으로 변환 할 수 있다.
		String tempMilistoTime = formatter.format(calendarAfter30.getTimeInMillis());
		Log.d( "WAHTUP", "tempMilistoTime = " + tempMilistoTime ); 

		// 현재 날짜 시간을 얻는다.
		Calendar calendarNowTime = Calendar.getInstance();

		for ( int a=0 ; a<1000 ; a++ ){

			Log.d( "WAHTUP", "a = " + a );

			// 10초 딜레이
			try
			{Thread.sleep( 10000 );} 
			catch ( InterruptedException e )
			{e.printStackTrace();}

			// 10초에 한번씩 현재 시간에 10초를 더 해준다.
			calendarNowTime.add( calendarNowTime.SECOND, 10 );

			Log.d( "WAHTUP", "calendarAfter30.getTimeInMillis(); = " + calendarAfter30.getTimeInMillis() );
			Log.d( "WAHTUP", "calendarNowTime.getTimeInMillis(); = " + calendarNowTime.getTimeInMillis() );

			// ( 현재시간 + 300분 ) < ( 현재시간 + 10 ) 가 더 커졌을 경우.!
			// 로그를 찍는다.
			if ( calendarAfter30.getTimeInMillis() < calendarNowTime.getTimeInMillis() ){
				Log.d( "WAHTUP", "300분이 지났습니다." );
			}
		}
	}
}


마지막으로 아래는 캘린더를 사용할 때 자주 사용하는 메서드 API 입니다.
참고 하시기 바랍니다.
   
abstract void add (int field, int amount) : Date 의 연산 기능입니다.
void clear () : 모든 시간 필드의 값을 클리어 합니다.
int get (int field) : 지정된 시간 필드의 값을 취득합니다.
static Calendar	getInstance () : 디폴트의 타임 존 및 로케일을 사용해 달력을 취득합니다.
Date getTime () : Calendar 의 현재 시각을 취득합니다.
void set (int field, int value) : 시간 필드에, 지정된 값을 설정합니다.
protected  long	getTimeInMillis () : Calendar 의 현재 시각을 long 로 취득합니다.
                                     밀리세컨드로 반환 합니다.