안드로이드

날짜와 시간에 관련된 클래스의 사용법

Rcen_J 2014. 8. 27. 13:41

날짜와 시간에 관련된 클래스의 사용법

프로그램을 개발하다고 보면 현재 시간을 알아야 하는 경우가 아주 빈번하게 생길수가 있다.
이런 작업은 JDK에 있는 java.util.Calendar라는 class를 통해서 알아낼 수가 있다. 그런데 이 Calendar라는 class가 추상클래스라서 Calendar 클래스 자체만으로는 현재 시간을 구할 수가 없다.그러면, java.util.Calendar 라는 클래스가 추상클래스로 만들어진 이유는 날짜와 시간을 계산하는 방법이 지역과 문화, 나라에 따라 다르기 때문이다. 그러므로, Calendar 클래스에는 날짜와 시간을 계산하는 일반적인 메소드만 있고, 특정한 날짜와 시간을 계산하는 방법은 서브클래스에서 구현이될 수 있도록 하였다.

예를 들어 양력에 관련되 날짜와 시간을 처리하는 서브클래스로 GregorianCalendar 클래스가 있다.

실제 컴퓨터에 있는 시간에 대해서

컴퓨터에 내장되어 있는 시간은 1970년 1월 1일 00:00:00 GMT(세계표준시) 를 기준으로 현재까지의 경과한 시간을 밀리세컨드로 표현되고 있습니다. 그렇기 때문에 이런 시간값을 사람들이 읽을 수 있는 날짜로 표현하기 위해서는 복잡한 로직이 있는데, 이런 것을 GregorianCalendar 클래스에서 할 수 있다.

GregorianCalendar를 이용하여 현재의 날짜와 시간을 알아내는 방법

파라미터 없는 생성자를 이용하여 GregorianCalendar의 객체를 생성하게 되면 시스템에 있는 현재 시간의 값을 가져올 수 있게 된다.

GregorianCalendar calendar = new GregorianCalendar();

calendar 객체에 있는 정보를 객체 맴버 메서드를 활용하여 다음과 같이 가져올 수 있다.

int year = calendar.get(Calendar.YEAR);          // 연도를 리턴
int month = calendar.get(Calendar.MONTH);    // 월을 리턴
int date = calendar.get(Calendar.DATE);          // 일을 리턴
int amPm = calendar.get(Calendar.AP_PM);    // 오전/오후 구분을 리턴
int hour = calendar.get(Calendar.HOUR);         // 시를 리턴
int min = calendar.get(Calendar.MINUTE);       // 분을 리턴
int sec = calendar.get(Calendar.SECODE);      // 초를 리턴

아래는 현재의 날짜와 시간을 출력하는 프로그램이다.

import java.util.GregorianCalendar;
import java.util.Calendar;

class CalendarExample {
    public satic void main(String[] args) {
        GregorianCalendar calendar = new GregorianCalendar();
        int year = calendar.get(Calendar.YEAR);          
        // 월은 0~11로 리턴되기 때문에 1을 더한다.
        int month = calendar.get(Calendar.MONTH) + 1;    
        int date = calendar.get(Calendar.DATE);          
        int amPm = calendar.get(Calendar.AP_PM);    
        int hour = calendar.get(Calendar.HOUR);         
        int min = calendar.get(Calendar.MINUTE);       
        int sec = calendar.get(Calendar.SECODE);
        String sAmPm = amPm == Calendar.AM ? "오전" : "오후";

        // 연월일 시분초를 주어진 포맷으로 출력
        System.out.printf("%d년 %d월 %d일 %s %d시 %d분 %d초",
           year, month, date, sAmPm, hour, min, sec);
    }

현재 다른 나라의 시간과 시간을 출력

컴퓨터에 있는 시간은 미국에서 만든 컴퓨터든, 독일에서 만든 컴퓨터든 똑같다. GMT 기준 시간으로 시간을 계산하기 때문이다. 하지만, 지금 출력되는 프로그램의 결과는 실제 우리나라의 시간과 같다. 그 이유는 OS에 현재 지역이 우리나라로 설정이 되어 있기 때문이다. 그렇다면 중국의 현재 시간을 알고 싶으면 GregorianCalendar 의 setTimezone 메소드를 활용하면 된다.
calendar.setTimeZone(timeZone); // timeZone은 TimeZone클래스의 객체
timeZone 객체는 TimeZone 클래스의 정적메소드인 getTimeZone을 호출해서 얻는다.

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

아래는 런던의 현재날짜와 시간을 출력하는 프로그램이다.

import java.util.GregorianCalendar;
import java.util.Calendar;

class CalendarExample {
    public satic void main(String[] args) {
        GregorianCalendar calendar = new GregorianCalendar();

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

        int year = calendar.get(Calendar.YEAR);          
        // 월은 0~11로 리턴되기 때문에 1을 더한다.
        int month = calendar.get(Calendar.MONTH) + 1;    
        int date = calendar.get(Calendar.DATE);          
        int amPm = calendar.get(Calendar.AP_PM);    
        int hour = calendar.get(Calendar.HOUR);         
        int min = calendar.get(Calendar.MINUTE);       
        int sec = calendar.get(Calendar.SECODE);
        String sAmPm = amPm == Calendar.AM ? "오전" : "오후";

        // 연월일 시분초를 주어진 포맷으로 출력
        System.out.printf("%d년 %d월 %d일 %s %d시 %d분 %d초",
           year, month, date, sAmPm, hour, min, sec);
    }
}

참고로 TimeZone 을 얻기위해 입력으로 들어가는 String 들은 다음으로 구할 수 있다.

class TimeZoneIDs {
    public static void main(String[] args) {
        for (String nam : TimeZone.getAvailableIDs())
            System.out.println(name);
    }
}

날짜/시간 객체를 다양하게 표현하는 방법 (DateFormat 클래스와 SimpleDateFormat 클래스)

우선 DateFormat과 SimpleDateFormat 클래스를 활용하게 되면 위의 두 프로그램에서와 같이 많은 코딩을 하지 않아도 된다. 날짜와 시간을 포맷하는 기능을 가진 대표 클래스는 java.text 패키지에 있는 DateFormat 클래스인데, 이 클래스는 추상 클래스이기 때문에 직접 사용할 수 없고, 이 클래스의 서브클래스를 사용한다. SimpleDateFormat 클래스가 해당 서브클래스이다.


yyyy, MM, dd, aa, hh, mm, ss는 의미가 있는 문자들이다. yyyy는 연도를 4자리로 표시하라는 의미이고, MM, dd, aa, mm, ss는 각각 해당 값들을 2자리로 표시하라는 의미이다. 이런 문자를 패턴문자라고 한다. SimpleDateFormat 클래스의 API문서를 확인하면 더 많은 패턴 문자를 확인할 수 있다.

GregorianCalendar 객체를 활용하여 SimpleDateFormat으로 포맷팅한 방법은 다음과 같다.

GregorianCalendar calendar = new GregorianCalendar();
Date date = calendar.getTime();

 // date는 날짜와 시간정보를 담고 있는 객체
String str = dateFormat.format(date);

실제 동작하는 프로그램은 다음과 같다.

class DateFormatTest1 {
    public static void main(String[] args) {
        GregorianCalendar calendar = new GregorianCalendar();
     SimpleDateFormat dateFormat = 
        new SimpleDateFormat("yyyy년 MM월 dd일 aa hh시mm분ss초");
     String str = dateFormat.format(calendar.getTime());
     System.out.println(str);
    }
}

다른 지역의 날짜와 시간을 표시하는 프로그램


class DateFormatTest1 {
    public static void main(String[] args) {
        GregorianCalendar calendar = new GregorianCalendar();
     SimpleDateFormat dateFormat = 
             new SimpleDateFormat("yyyy년 MM월 dd일 aa hh시mm분ss초");
     // 뉴욕에 해당하는 TimeZone객체를 직접 생성 바로 전달
    dateFormat.setTimeZone(TimeZone.getTimeZone("America/New_York"));
     String str = dateFormat.format(calendar.getTime());
     System.out.println(str);
    }
}

 

출처 :  http://myroid.blogspot.kr/2011/10/blog-post_2067.html