12_자바 타임 정리(currentmills,Date,Simpledateformat,javatime,calendar)

 

안녕하세요 Mr_ChooC(coding)AI 입니다~

이번 포스트에서는 자바에서 Time을 어떻게 처리 할 것인지를 심도있게 다루어 보도록 하겠습니다. 아마 여러분이 java프로젝트를 하시면서 Time관련 에러를 발견하셨을 때 해결하기 위해서 Time관련 내용을 찾으면 다양한 내용이 나와서 이거 시도 했다가 저거 시도 하다가 하면서 꼬인 경험이 있을 수도 있을 것이라고 생각합니다. 그래서 이번 포스트에서는 자바에서 다루는 중요한 타임 클래스를 다 정리해서 2번 찾을 필요 없고 꼬일 일도 없도록 깔끔하게 정리하고 example code까지 제공 하도록 하겠습니다. 이거 하나만 보시면 자바에서 오는 타임을 다 해결할 수 있는 힌트를 드리도록 하겠습니다.

실습 코드느 github을 참조 해주세요~

Github: https://github.com/Chooyoungjun/javastudy/tree/main/13_java_time

자바 time class 정리

1.     System.currentTimeMills

2.     Java.util.Calendar

3.     Java.util.Date

4.     SimpleDateFormat

5.     Java.time package

A.     Time 패키지의 클래스 종류(LocalDate, LocalTime, LocalDateTime)

B.     클래스들의 정보 값 읽어오기(getYear…)

C.     클래스들의 정보 더하기/빼기(minusMonths, plusHours…)

D.     클래스들의 정보 값 변경하기(withDayOfMonth, withSecond…)

E.      클래스들의 정보 값 비교하기(isAfter, until…)

 

자바 time class 정리

자바에서는 시간 처리하기 위해서 주로 하기 5가지 클래스를 제공 합니다. 그래서 5가지 시간 관련 클래스에 대해서 알아보고 이해를 위해서 예제 code를 제공하도록 하겠습니다.

1.     System.currentTimeMills

currentTimeMills클래스는 시간을 1/1000초 단위로 계산하며 데이터 타입은 long 타입으로 반환하고 이러한 시간을 Unix시간이라고 합니다. Unix시간 특징으로는 시작 날짜가 198011일을 기준으로 1/1000초 단위로 count하고 있는 숫자 입니다. 그래서 currentTimeMills3이 증가 했으면 3/1000초가 지났다는 의미 입니다. 간단하게 실습을 통해서 이해해 보도록 하겠습니다.

[실습]

프로그램 실행 되는데 걸리는 시간 계산


위의 snapshot과 같이 currentTimeMills은 현재 시간을 1/1000초 단위로 불러오는 것을 알 수 있습니다. 이러한 클래스를 활용해서 걸리는 시간을 표시할 수 있습니다. 그런데 걸리는 시간이 너무 작아서 소수점 자리까지 확인하고 싶다면 long type에서 double로 형변환을 시켜줘야 하는 것을 명심하세요!!

2.     Java.util.Calendar

위에서 Unix시간을 부르는 currentTimeMills에 대해서 배웠습니다. 하지만 이러한 숫자를 기반으로 우리는 날짜와 시간을 정확하게 알 수 없습니다. 이러한 문제점을 보완하기 위해서 만든 클래스가 앞으로 배울 클래스 들이라고 이해하시면 되겠습니다. 일단 이번 Section에서는 CalendarGregorian Calendar를 배울 예정입니다.

각 클래스 별 특징

-      Calendar: 추상 클래스이기 때문에 객체화하기 위해서는 getInstance 메서드를 사용해야 합니다.

-      Gregorian Calendar: 클래스이기 때문에 객체화 가능합니다.

위의 특징에 대해서 이해 하기 위해서 실습을 진행해 보도록 하겠습니다.

[실습]


위의 Snapshot과 같이 실습을 진행해 보았습니다. Calendar 클래스는 추상클래스이기 때문에 getinstance를 활용해서 객체화 하였습니다. 그리고 GregorianCalendar는 클래스이기 때문에 저희가 아는 방식으로 객체화 하였습니다. 출력된 데이터를 확인해 보면 년도와 날짜와 시간까지 다 있는 것을 확인 할 수 있습니다.

[get & set method]

Calendar클래스에 있는 getset메서드에 대해서 알아보도록 하겠습니다. get을 통해서 시간 관련 값을 호출 할 수 있고 set을 통해서 원하는 날짜로 unix시간 값을 지정 할 수도 있습니다. 이러한 기능에 대해서 알아보도록 하겠습니다.

[실습]

오늘 날짜 기준으로 연말 및 크리스마스까지 얼마나 남았는지 확인하는 실습을 해 보도록 하겠습니다.


위의 실습 코드에서 보시면 get을 통해서 지금 설정되어 있는 unix시간 기준의 년 월 일 등을 얻을 수 있는 것을 알 수 있습니다. 여기에서 특징은 month0부터 시작 하기 때문에 1을 플러스 해 줘야지 저희가 알고 있는 기준의 월을 얻을 수 있습니다. 그리고 원하는 날짜로 unix시간을 변경하기 위해서는 set이라는 함수를 사용 합니다. unix시간을 일자 기준으로 바꾸기 위해서는 (24*60*60*1000)을 나누어 줘야합니다. 이 부분에 대해서 확인하시고 넘어가시기를 부탁 드리겠습니다.

3.     Java.util.Date

시간을 다루는 또다른 클래스인 Date클래스에 대해서 정리해 보겠습니다. 이 클래스의 특징에 대해서 정리해 보겠습니다.

-      JDK 1.0부터 제공되는 클래스

-      문제가 있어서 대부분의 메서드와 생성자를 사용 안 합니다.(java.time을 활용함)

-      오래 전부터 있는 클래스이기 때문에 알고 있어야 코드 분석에 용이 합니다.

-      Unix시간을 현재 날짜와 시간으로 변경해 주는 클래스 입니다.

[문법]

Date 매개변수 = new Date();

[실습]

Date클래스로 현재 날짜를 불러오고 currentTimeMills를 활용해서 unix시간을 Date로 변환 시키는 실습을 진행 하도록 하겠습니다.


위의 Snapshot처럼 객체화하면 바로 현재 시간을 불러 올 수 있는 것을 알 수 있습니다. 그리고 unix시간을 입력해서 지금 날짜 형태로 변환 할 수 있는 것을 알 수 있습니다.

4.     SimpleDateFormat

날짜 형식을 위에서 제공하는 DateCalendar외에 다른 형식으로 보여 주고 싶을 때 사용하는 클래스 입니다. 일단 형식을 지정 할 수 있는 기호에 대해서 먼저 정리해 보도록 하겠습니다.

[기호]


위의 기호대로 format을 만드시면, 형식대로 데이터를 출력 할 수 있습니다. 실습을 통해서 자세하게 알아보도록 하겠습니다.

[실습]


위의 실습대로 각 나라의 기준에 맞추어서 기호를 배열하여 출력 할 수 있습니다. 이러한 점을 확인하시고 넘어가시면 되겠습니다. 아 그리고 이 클래스는 Date클래스와 함께 사용한다는 점을 꼭 확인해 주세요!

5.     Java.time package

Java에서 날짜와 시간을 다루기 위해서 만든 패키지

-      JDK 1.8부터 추가 되었고, 기존의 DateCalendar를 보완하는 페키지 입니다.

Java.time에서 어떤 것을 제공하는 지 표로 정리하여 보여 드리도록 하겠습니다.


위의 표에서 보여주는 API를 제공하고 있습니다. 제공하는 API를 활용해서 시간을 다루고 출력해 보도록 하겠습니다.

A.     Time 패키지의 클래스 종류(LocalDate, LocalTime, LocalDateTime, ZonedDateTime)

n  LocalDate 클래스

날짜 관련해서 주로 다루고 저장하는 클래스 입니다.

[문법]

LocalDate ld = LocalDate.now(); 현재의 날짜 부르는 방법

LocalDate ld = LocalDate.of(int year, int month, int dayOfMonth); 지정 날짜 부르는 방법

위의 2가지 방법 처럼 nowof를 활용하여 지금 날짜와 지정 날짜를 호출하여 객체로 만들 수 있습니다.

n  LocalTime 클래스

시간 관련해서 주로 다루고 저장하는 클래스 입니다.

[문법]

LocalTime ld = LocalTime.now(); 현재의 날짜 부르고 저장하는 방법

LocalTime ld = LocalTime.of(int hour, int minute, int second, int nanoOfSecond); 지정 시간 부르고 저장하는 방법

위의 2가지 방법 처럼 nowof를 활용하여 지금 시간과 지정 시간를 호출하여 객체로 만들 수 있습니다

n  LocalDateTime 클래스

LocalDateTimeLocalDateLocalTime를 결합한 클래스 입니다.

[문법]

LocalDateTime ld = LocalDateTime.now();

현재의 날짜와 시간을 부르고 저장하는 방법

LocalDateTime ld = LocalDateTime.of(int year, int month, int dayOfMonth ,int hour, int minute, int second, int nanoOfSecond);

지정 날짜와 시간을 부르고 저장하는 방법

위에서 보여준 Time클래스 외에도 다른 클래스도 있지만, 많이 쓰이는 것 위주로 일단 정리하였습니다. 계속 정리를 이어 가도록 하겠습니다.

B.     클래스들의 정보 값 읽어오기(getYear, getNano…)

LocalDateLocalTime이 보유하고 있는 값을 가져오는 메서드에 대해서 정리해 보도록 하겠습니다.


위의 그림과 같이 메서드를 활용해서 값을 불러오면 됩니다. 위의 표만 봐서는 잘 이해가 안 되기 때문에 실습을 진행해 보도록 하겠습니다.

[실습]


위의 실습과 같이 잘 실행 되는 것을 알 수 있습니다. 크게 내용은 없고 위의 method만 잘 활용하면 된다는 점만 알고 계시면 될 것 같습니다.

C.     클래스들의 정보 더하기/빼기(minusMonths, plusHours…)

이제는 클래스에서 년을 기준으로 달을 기준으로 그리고 초를 기준으로 빼고 더 할 수 있도록 메서드를 제공하는 부분에 대해서 알아 보도록 하겠습니다. 이러한 메서드는 하기 표를 참조 하시면 되겠습니다.


위의 표대로 메서드를 호출해서 사용하면 되겠습니다. 실습을 통해서 자세하게 디해해 보도록 하겠습니다.

[실습]


위의 실습대로 잘 적용 되는 것을 확인 할 수 있습니다. 이대로 적용해서 사용하시면 되겠습니다.

D.     클래스들의 정보 값 변경하기(withDayOfMonth, withSecond…)

이번에는 클래스의 값을 지정한 날짜로 변경하는 방법에 대해서 알아 보겠습니다. 그러한 기능을 지원 하는 메서드는 하기표를 참조해 주시기를 부탁 드리겠습니다.


위에 보이는 메서드를 통해서 원하는 날짜로 변경하는 코드 입니다. 실습읕 통해서 더 정확하게 이해해 보도록 하겠습니다.

[실습]


위의 실습을 통해서 이해 하셨습니까? 이렇게 이해해서 사용 하시면 되겠습니다.

E.      클래스들의 정보 값 비교하기(isAfter, until…)

지금 까지 배운 time값을 비교하는 메서드도 지원을 합니다. 여기에 대해서 알아보도록 하겠습니다. 먼저 종류에 대해서 정리해 보도록 하겠습니다.


위의 표와 같은 method를 지원 합니다. 어떻게 사용하는지 실습을 통해서 익히도록 하겠습니다.

[실습]


위와 같이 활용이 가능한 것을 확인하시면 되겠습니다.

자 이렇게 해서 자바에서 나오는 시간클래스에 대해서 거의 다 정리 하였습니다. 충분히 잘 숙지 하셨다면 시간 관련해서는 앞으로 어떤 문제든 해결 할 수 있을 것이라고 믿겠습니다. 긴 글을 읽어 주셔서 감사합니다.

Comments