Java (자바)

[Java] 현재 날짜, 시간 구하기 / Date / Calendar / System 클래스 맛보기

Oscar:) 2023. 4. 13. 05:13

 

자바에서 현재 날짜 및 시간을 구하는 대표적인 방법은 3가지가 있다.

 

● Date 클래스

 

● Calendar 클래스

 

● System 클래스

 

 

사용하는 문법은 다음과 같다.

	// SimpleDateFormat 클래스 : 원하는 형식으로 포맷해준다.
	SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	// Date 클래스
        Date date = new Date();
        String time1 = simpleDateFormat.format(date);

        // Calendar 클래스
        Calendar calendar = Calendar.getInstance();
        String time2 = simpleDateFormat.format(calendar.getTime());

        // System 클래스
        String time3 = simpleDateFormat.format(System.currentTimeMillis());

        // 출력
        System.out.println("Date : " + time1);
        System.out.println("Calendar : " + time2);
        System.out.println("System : " + time3);

 

출력 결과는 다음과 같다.

 

3가지 방법 모두 정확한 현재 일시를 불러와준다.

 


 

· SimpleDateFormat 클래스의 생성자 매개변수 인자값에는 패턴을 입력해준다.

자주 사용하는 패턴의 종류는 다음과 같다.

 

패턴 의미
y
M
d
h 시 (1~12)
H 시 (0~23)
m
s
S 1/1000초

 


 

· 위 코드에서 Calendar 클래스의 경우, 눈으로 확인할 수 있는 2가지 특징이 있다.

 

 

1. new 연산자를 사용하지 않고 getInstance()로 인스턴스를 받아온다.

 

Calendar 클래스는 추상클래스이기 때문에, new 연산자를 사용하여 객체를 생성할 수 없다.

 

이는 전 세계적으로 사용되는 달력의 체계가 다르기 때문에,

상황에 맞게끔 보다 유동적으로 사용할 수 있다는 장점이 될 수 있다.

 

 

 

2. calendar.getTime() 으로 일시를 불러온다.

 

여기서 사용하는 getTime()은 Date 클래스에 내장되어 있는 메서드이다.

 

이 부분에서 Calendar 클래스와 Date 클래스의 관계에 대해서 생각해 볼 필요가 있다.

 

 

Date 클래스는 JDK 1.0부터 지원해왔고, JDK 1.1에서 Calendar 클래스가 출시되었다.

 

Calendar 클래스는 Date 클래스를 보완할 수 있는 기능들을 포함하여 출시되었고,

결국 Date 클래스의 많은 메서드를 Deprecated 시킨 장본인이다.

절반 이상의 메서드가 Deprecated된 모습을 확인할 수 있다.

 

이렇게 보면 Calendar 클래스가 Date 클래스의 상위 호환이라고 느낄만하지만,

상황에 따라서는 Date 클래스의 메서드를 그대로 사용하기도 하는 점을 보아

 

Calendar 클래스가 Date 클래스를 보완하면서 동시에 의존한다는 느낌을 준다.

 


 

· Deprecated된 Date 클래스의 대부분의 메서드들은,

Calendar 클래스의 상수로 대체되었다.

 

상수 내용
public static final int YEAR
public static final int MONTH
public static final int DATE
public static final int DAY_OF_WEEK 요일 (일요일:1 ~ 토요일:7)
public static final int HOUR 시 (12시간제)
public static final int HOUR_OF_DAY 시 (24시간제)
public static final int MINUTE
public static final int SECOND
public static final int MILLISECOND 1/1000초

 

Calendar 클래스의 상수를 호출하여 확인해 보겠다.

        Calendar calendar = Calendar.getInstance();
        String time = simpleDateFormat.format(calendar.getTime());

        System.out.println("Calendar.getTime() : " + time);
        System.out.println(calendar.get(Calendar.YEAR) + "년");
        System.out.println(calendar.get(Calendar.MONTH) + "월");
        System.out.println(calendar.get(Calendar.DATE) + "일");
        System.out.println(calendar.get(Calendar.HOUR_OF_DAY) + "시");
        System.out.println(calendar.get(Calendar.MINUTE) + "분");

 

결과는 다음과 같다.

 

다른 데이터는 모두 일치하는데, '월' 에 해당하는 데이터는 일치하지 않는다.

분명 4월인데 Calendar.MONTH는 3월로 출력되는 것을 확인할 수 있다.

 

이는 Calendar 클래스가 1월을 0으로 지정해 놓았기 때문이다.

 

일(DATE)은 1부터 시작하는데,

굳이 월(MONTH)만 0부터 시작하게끔 해놓은 이유가 무엇일까 궁금해지던 찰나.

 

Calendar 클래스 내부에서 작은 힌트를 찾을 수 있었다.

*UNDECIMBER = 13월

 

바로 13월의 존재였다.

에티오피아에서 사용하는 달력인 '에티오피아력' 에는 13월이 존재하는 모양이다.

 

나라마다 다른 달력의 체계에 맞게끔, 준비성이 철저한 Calendar 클래스였다..

 


 

· 이번에는 SimpleDataFormat 을 적용하지 않은 상태를 확인해보고자 한다.

        Date date = new Date();
        Calendar calendar = Calendar.getInstance();

        // 출력
        System.out.println(date);
        System.out.println(calendar.getTime());
        System.out.println(System.currentTimeMillis());

 

결과는 다음과 같다.

 

Date 클래스와 Calendar 클래스는 정해진 형태로 일시를 나타내준다.

하지만 System 클래스에서 가져온 데이터는 어떤 형태인지 알아볼 수 없다.

 

 

이것도 마찬가지로, System 클래스를 찾아 들어가서 확인해 보았다.

 

주석 처리된 부분을 해석해보니,

1970년 1월 1일 0시 0분 부터 현재 시간 까지의 차이를 밀리초 단위로 반환한다고 한다.

 

*1970년 1월 1일 0시 0분은 '협정 세계 시(UTC)' 가 지정된 시기에 영향을 받은 기준이라고 한다.

 

 

위와 같은 시스템 시간을 사용하면 인간의 눈에는 보기 불편할 수 있지만,

많은 장점이 생길 수 있다.

 

· 날짜와 시간을 DB에 문자열이 아닌 숫자로 저장할 수 있다.

· 협정 세계시를 기준으로 시작되었기에, 전 세계에 같은 시간이 적용된다.

· 클라이언트에게는 해당 로컬 타임으로 포맷하여 전달하면 되기에 편리하다.

 

 

· 그럼, 시스템 시간을 나눗셈하여 현재 시간과 비교해보자.

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = simpleDateFormat.format(System.currentTimeMillis());

        long currentTimeMillis = System.currentTimeMillis();
        long sec = currentTimeMillis / 1000;
        long min = sec / 60;
        long hour = min / 60;
        long day = hour / 24;
        long week = day / 7;
        long month = day / 30;
        long year = day / 365;
        
        // 출력
        System.out.println(time);
        System.out.println(System.currentTimeMillis());
        System.out.println(year + "년 or " + month + "달 or " + week + "주 or "
        + day + "일 or " + hour + "시간 or " + min + "분 or " + sec + "초");

 

결과는 다음과 같다.

 

출력된 각각의 행의 의미는 다음과 같다.

 

1. 보기 편하게 포맷한 현재 시간

2. 시스템 시간

3. 시스템 시간을 년,월,일 등의 형식으로 나눗셈한 결과

 

2023년 - 1970년 = 53년이므로,

시스템 시간의 정의를 눈으로 확인할 수 있었다.

 


 

종합)

 

Date / Calendar / System 클래스 모두 현재 일시를 정확히 받아올 수 있다.

 

3가지 방식은 사용성에 있어서 각각의 장단점이 있다.

 

DB에 시간을 저장해야 된다면,

System 시간을 사용하는 것이 편의성이 좋다고 생각한다.