(JAVA) 현재 날짜 및 시간 가져오기 / 날짜 맛보기 / 달력 / 시스템 수업

Java에서 현재 날짜와 시간을 가져오는 대표적인 방법은 세 가지가 있습니다.

● 데이트 클래스

● 캘린더 클래스

● 시스템 클래스

사용된 구문은 다음과 같습니다.

	// 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);

출력 결과는 다음과 같습니다.


세 가지 방법 모두 정확한 현재 날짜와 시간을 표시합니다.


· SimpleDateFormat 클래스의 생성자 매개변수에 패턴을 입력합니다.

자주 사용되는 패턴의 종류는 다음과 같습니다.

무늬 의미
와이 년도
시간 시(1-12)
시간 시간(0-23)
에스 양초
에스 1/1000초


· 위 코드에서 Calendar 클래스의 경우 육안으로 확인할 수 있는 기능은 두 가지다.

1. new 연산자를 사용하지 않고 getInstance()로 인스턴스를 가져옵니다.

Calendar 클래스는 추상 클래스이므로 new 연산자를 사용하여 개체를 만들 수 없습니다.


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

상황에 맞게 좀 더 유연하게 사용할 수 있다는 것이 장점이 될 수 있습니다.

2. calendar.getTime()으로 날짜와 시간을 가져옵니다.

여기에 사용된 getTime()은 Date 클래스의 내장 메서드입니다.


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

Date 클래스는 JDK 1.0부터 지원되었으며 Calendar 클래스는 JDK 1.1에서 릴리스되었습니다.

Calendar 클래스는 Date 클래스를 보완하는 기능과 함께 출시되었습니다.

결국 그는 Date 클래스의 많은 메서드를 더 이상 사용하지 않는 사람입니다.


메소드의 절반 이상이 더 이상 사용되지 않는 것을 볼 수 있습니다.

이렇게 보면 Calendar 클래스가 Date 클래스와 상위호환되는 느낌을 받을 수 있지만

상황에 따라 Date 클래스의 메서드를 그대로 사용하는 것을 고려하여.

Calendar 클래스가 Date 클래스를 보완하고 의존한다는 느낌을 줍니다.


· 더 이상 사용되지 않는 Date 클래스의 대부분의 메서드,

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

상수 세부 사항
공개 정적 최종 int YEAR 년도
공개 정적 최종 정수 MONTH
공개 정적 최종 int DATE
공개 정적 최종 정수 DAY_OF_WEEK 요일 (일요일:1 ~ 토요일:7)
공개 정적 최종 int HOUR 시간(12시간제)
공개 정적 최종 정수 HOUR_OF_DAY 시간(24시간제)
공개 정적 최종 int MINUTE
공개 정적 최종 int SECOND 양초
공개 정적 최종 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으로 지정하기 때문입니다.

일은 1에서 시작하고,

달(MONTH)만 0부터 시작하는 이유가 무엇인지 궁금했던 순간.

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


*UNDECIMBER = 13개월

13개월의 존재였다.

에티오피아에서 사용하는 달력인 에티오피아 달력에는 13개월이 존재하는 것 같습니다.

각 나라의 서로 다른 달력 체계에 맞게 철저히 준비한 달력 수업이었습니다.


· 이번에는 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일 00:00부터 현재 시간까지의 차이를 밀리초 단위로 반환합니다.

* 1970년 1월 1일 00:00은 ‘Coordinated Universal Time(UTC)’이 지정된 시간의 영향을 받는 기준이라고 합니다.

위와 같이 시스템 시간을 사용하는 것은 사람의 눈에는 불편할 수 있지만

체계적으로 많은 장점이 있습니다.

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

· Coordinated Universal Time을 기준으로 시작하였기 때문에 전 세계적으로 같은 시간을 적용합니다.

· 해당 현지 시간으로 포맷하여 클라이언트에게 전달하는 것이 편리합니다.

· 그런 다음 시스템 시간을 나누어 현재 시간과 비교합니다.

        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년이므로

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


합성)

모든 날짜/달력/시스템 클래스는 현재 날짜와 시간을 정확하게 얻을 수 있습니다.

세 가지 방법 각각은 유용성 측면에서 고유한 강점과 약점을 가지고 있습니다.

개인적으로 시스템 시간을 활용한 장점이 가장 돋보이는 것 같습니다.