** java.util.Calendar는 추상 클래스이다.

 

Date 클래스의 대부분 밀레니엄 버그로현재 Deprecated 된 것들이지만 아직 유효한 것들도 있다. 하지만Calendar클래스를 사용할 것을 권장 한다.

 

또한Calendar클래스는 일계산, 주별계산, 월별계산, 년별계산이 가능하기 때문에 달력에 관한 거의 모든 처리를 쉽게 할수 있다. 반면 Date 클래스는 시간, 일 에 대한 계산을 해주기 때문에 주별계산, 월별계산, 년별 계산등을 직접 구현해 줘야 한다.

 

따라서 Date클래스에 대한 구체적인 논의의 가치가 별로 없지만 아직도 기존 소스에서 Date의 사용하고 있으므로 정리한다.

 

Java.util.Date.getTime()January 1, 1970, 00:00:00 GMT”이후부터 지금까지 흐른 시간을 밀리세컨드로 환산한 값을 반환한다는 점에 주목해야 한다. 따라서 반환된 값에대해서는 프로그램 로직으로 직접 계산해서 사용 해야한다. 그리고 java.util.Date는 항상 1900을 달고 다녀야 한다. Java.util.Date.getYear() 메서드는 1900년으로 부터의 년수를 반환하므로  지금의 연도를 표현하려면 1900을 더해줘야하고 생성자에서 년도는 2001 에서 1900을 빼줘야 한다.그리고 달도 0부터 시작되며 생성자에서는 -1 해줘야 한다.

 

Calendar 객체 생성

일반적으로

    GregorianCalendar now = new GregorianCalendar();

와 같이 오브젝트를 생성하여 사용하기도 하지만  Calendar차 후에 어떤 종류의 Calendar를 담을수 있도록 Calendar 추상 클래스의 변수를 사용하는 것을 다음과 같이 권장한다.

    Calendar now = new Calendar .getInstance();

 

 

Calendar & Time zone

TimeZone 클래스를 Calendar클래스와 함께 이용하게되면 해당 지역의 시간으로 설정 할 수있습니다.

 

    // 기본 Time Zone

    TimeZone tz = Calendar.getInstance().getTimeZone();

 

    // 런던의 시간을 기준으로 Calendar를 설정한다.

    TimeZone timeZone = TimeZone.getTimeZone("Europe/London");

    Calendar calendar = new Calendar.getInstance();

    calendar.setTimeZone(timeZone);

 

TimeZone에 대한 ID는 "static String[] getAvailableIDs()" API로 확인 할 수 있다.

 


TimeZone

일반 적으로 현재 시스템에서의 날짜는 GregorianCalendar Calendar클래스를 이용하여 다음과 같이 현재의 시간 정보를 구할 있다.

 

       GregorianCalendar now = new GregorianCalendar();

       Calendar now = new GregorianCalendar();

       Calendar now = Calendar.getInstance();

       ** 마지막으로 now 인스턴스를 구하는 것을  추천한다.

 

Calendar객체를 재설정 하고자 하는 경우의

   now.set(Calendar.YEAR, 1972);

   now.set(Calendar.MONTH, Calendar.MAY);

now.set(Calendar.DATE, 20);

 

 하지만 세계 각국의 시간정보를 구하기 위해서는 TimeZone클래스를 이용하여 설정 작업을 해야한다.

       Calendar now = Calendar.getInstance();

       now.setTimeZone(TimeZone.getTimeZone("US/Mountain"));

 

Java.util.Date 인스턴스는 1970 1 1 이후 부터의 지난 시간을 밀리세컨드로 환산한 절대 값을 갖는다. 그러나 Calendar Date 정보를 현재 시스템(또는 새로 설정한) Locale 맞는 날짜 정보로 변환해 준다.

 

다음 코드는 동일한 Date 두개의 다른 Time Zone 테스트 하는 코드이다.

 

public class DateTest {

 

       /**

        * @param args

        */

       public static void main(String[] args) {

 

              Date date = new Date();

 

              Calendar now = Calendar.getInstance();

 

              // 서울  : Asia/Seoul

              // 멜번 : Australia/Melbourne

              TimeZone AUML = TimeZone.getTimeZone("Australia/Melbourne");

              Calendar aus = Calendar.getInstance(AUML);

              aus.setTime(date);

              System.out.println("호주/멜번 : " + aus.get(Calendar.YEAR) + "-" + aus.get(Calendar.MONTH) + "-" 

                       + aus.get(Calendar.DATE) + " "   + aus.get(Calendar.HOUR) + ":" 

                       + aus.get(Calendar.MINUTE) + ":" + aus.get(Calendar.SECOND));

 

              TimeZone KOSL = TimeZone.getTimeZone("Asia/Seoul");

              Calendar kor = Calendar.getInstance(KOSL);

              kor.setTime(date);

              System.out.println("한국/서울 : " + kor.get(Calendar.YEAR) + "-" + kor.get(Calendar.MONTH) + "-" 

                       + kor.get(Calendar.DATE) + " "   + kor.get(Calendar.HOUR) + ":" 

                       + kor.get(Calendar.MINUTE) + ":" + kor.get(Calendar.SECOND));

 

       }

 

}

 

 

 

결과

호주/멜번 : 2013-10-1 3:15:33

한국/서울 : 2013-10-1 1:15:33

 

'Java > Core Utilities' 카테고리의 다른 글

Preferences & PreferenceChangeListener  (0) 2013.02.09
Properties  (0) 2013.02.09
Collection, Map 클래스의 사용시 성능과 계층구조  (0) 2013.02.09
Collections과 정렬  (0) 2013.02.09
Timer, TimerTask & TimeZone  (0) 2013.02.09
Posted by Steven J.S Min
,