본문 바로가기
TIL(Today I Learned)

[Java] 시간 정보 다루기

by kkkdh 2023. 2. 3.
728x90

Date

JDK 1.0부터 지원하는 java.util 패키지의 Date 클래스는 날짜와 시간을 구하는 목적으로 사용할 수 있다.

 

하지만, 최초로 만들어진 클래스이니 만큼 지역화에 대한 부분이 고려되지 않고 만들어진 클래스이다. 

지역에 따라 시간, 통화(원, 달러, 엔, 유로, 파운드 등..), 언어등에 대하여 고려하는 프로그래밍을 지역화에 맞춘 프로그래밍이라고 한다

이런 Date class의 단점을 보완하기 위해서 Calendar 클래스(JDK 1.1부터)가 만들어졌다고 한다.

 

스펙을 찾아봐도 대부분의 Date 생성자가 deprecated로 표기되어 있으니 웬만하면, Calendar를 사용하는 것이 좋을 것 같다.

위와 같은 예제처럼 사용할 수 있으며, SimpleDateFormat을 활용해서 원하는 양식대로 날짜 정보를 출력하도록 구현할 수 있다.

프로그램 실행 결과


Calendar

Date의 단점을 해결하기 위해 등장한 것이 Calendar 클래스이다. 

 

Date가 지역화에 대해 고려되지 않고 만들어진 점을 보완하기 위해서 만들어진 클래스이다.

 

추상 클래스로 설계되어 직접 인스턴스를 생성하는 것은 불가능하다. 대신에 getInstance() method를 사용해서 인스턴스 생성이 가능한데, 이는 내부적으로 java.util.GregorianCalendar 클래스의 인스턴스를 생성해서 반환하는 형태라고 한다.

 

굳이 인스턴스의 생성을 사용자에게 숨기는 이유는 표준 달력 양식이 바뀔수도 있기 때문이라고 한다.

 

다양한 Calendar의 클래스 멤버로 선언된 상수들을 이용해 get method와 함께 특정 정보를 뽑아내거나, add method를 이용한 특정 단위의 시간 연산 같은 것들이 가능하다.

get method: Calendar 인스턴스가 현재 표현하는 시간 정보에서 원하는 시간 정보를 조회하기 위해 사용하는 method

add method: 현재 인스턴스가 표현하는 시간에 특정 단위의 시간을 추가 혹은 감소시키는 연산을 위해 사용하는 method

여타 상수들: get, add method 등에 연산 혹은 주회 단위의 주체를 표현하기 위해 사용하는 것 같다.

이렇게 클래스 멤버 값들이 특정 상수를 갖고 있는데, 이 상수를 기준으로 연산이나 조회의 단위를 결정하는 것 같다.
코드 실행 결과는 위와 같다.


java.time 패키지

Java에서 제공하는 Date, Time API는 부족한 기능 지원을 포함한 여러 문제점을 갖고 있었고, JDK 코어에서 이런 문제점들을 해결하고 더 좋고 직관적인 API 제공을 위해 Java SE 8부터 새롭게 재 디자인한 Date, Time API를 제공한다.

  • 새로운 API의 핵심 클래스는 오브젝트를 생성하기 위한 다양한 factory method를 사용한다.
  • 오브젝트 자기 자신의 특정 요소를 가지고 오브젝트를 생성할 경우 of method를 호출하면 되고, 다른 타입으로 변경할 경우에는 from method를 호출하면 된다.
LocalDateTime timePoint = LocalDateTime.now();

class method now를 이용해 현재 시간을 기반으로 LocalDateTime 객체의 인스턴스를 생성할 수 있다.

// 2012년 12월 12일의 시간에 대한 정보를 가지는 LocalDate객체를 만드는 방법  
LocalDate ld1 = LocalDate.of(2012, Month.DECEMBER, 12); // 2012-12-12 from values

// 17시 18분에 대한 LocalTime객체를 구한다.
LocalTime lt1 = LocalTime.of(17, 18); // 17:18 (17시 18분)the train I took home today

// 10시 15분 30초라는 문자열에 대한 LocalTime객체를 구한다.
LocalTime lt2 = LocalTime.parse("10:15:30"); // From a String

of method나 parse method를 사용해서 특정 요소를 기반으로 오브젝트를 생성할 수 있다.

 

  • LocalDateTime: 날짜 + 시간 정보
  • LocalDate: 날짜
  • LocalTime: 시간

각각의 객체는 위와 같은 정보를 표현하기 위해 사용된다.

 

이렇게 생성한 객체들의 getter method를 사용해 원하는 시간 혹은 날짜 정보를 뽑아낼 수도 있다.

LocalDate theDate = timePoint.toLocalDate();
Month month = timePoint.getMonth();
int day = timePoint.getDayOfMonth();
int hour = timePoint.getHour();
int minute = timePoint.getMinute();
int second = timePoint.getSecond();

// 달을 숫자로 출력한다 1월도 1부터 시작하는 것을 알 수 있습니다. 
System.out.println(month.getValue() + "/" + day + "  " + hour + ":" + minute + ":" + second);

위의 코드에서는 LocalDate 객체의 getter method를 사용해 특정 정보들을 뽑아낸 것이다.

 

내가 실행한 예시 코드

위와 같이 스펙에 있는 다양한 메서드를 활용해 보았다.

 

LocalDateTime 객체 인스턴스의 toLocalDate method를 이용해서 날짜 정보만을 저장한 LocalDate 객체를 뽑아낼 수도 있었다.

 

LocalDateTime 객체에서 getter를 통해 Month와 같이 return type이 숫자 형태가 아니라 각 날짜 정보에 맞는 타입으로 반환받을 수 있었고, 이를 출력하면 다음과 같다.

Month 객체를 출력하면, 문자열 형태로 월 정보를 반환한다.

getMonth 말고  getMonthValue method를 사용해서 숫자 형태로 반환 받을 수도 있었다.

 

공부한 결과 Date, Calendar 말고, java 8 이상의 프로젝트에서는 가급적 java.time 패키지에 포함된 클래스들을 이용해 날짜와 시간 정보를 다루면 될 것 같다는 생각이 들었다.

728x90

댓글