문홍의 공부장

[Java 8] java.time 패키지: Java LocalDate, LocalDateTime 클래스 사용법 (java.time package in Java SE8) 본문

개발/Java

[Java 8] java.time 패키지: Java LocalDate, LocalDateTime 클래스 사용법 (java.time package in Java SE8)

moonong 2020. 1. 27. 21:35
반응형

java.time 패키지

이전에 공부하였다시피 Date 클래스를 보완하기 위해 Calendar 클래스가 탄생했다. 하지만 Calendar 클래스에도 여전히 복잡하거나, 직관적이지 못한 (월이 0부터 시작한다는 등) 단점은 남아있다. 이를 보완하기 위해 JDK1.8부터 java.time 패키지가 추가되었다.

java.time 패키지의 클래스는, 변경 가능한 기존 Calendar 클래스와 달리 불변(immutable) 이다. 이에 멀티 쓰레드 환경에서도 안전하게 객체에 접근할 수 있다.

Calendar 클래스에서는 날짜와 시간을 하나로 표현하였다면, java.time 패키지에서는 날짜와 시간을 별도의 클래스로 분리해 놓았다. (LocalDateTime 클래스 = LocalDate 클래스 + LocalTime 클래스)
또한, 시간대를 다루는 ZonedDateTime, 날짜 간의 간격을 표현하는 Period, 시간의 차이를 표현하는 Duration 클래스가 존재한다.

java.time 패키지에 속한 클래스는, 기본적으로 now()of() 메소드를 사용하여 객체를 생성한다.

  • .now() : 현재 날짜와 시간을 저장하는 객체 생성
  • .of() : 사용자 정의의 날짜/시간 객체 생성 (해당 필드 값을 입력)

LocalDate, LocalTime 클래스

날짜를 표현하는 LocalDate 클래스와, 시간을 표현하는 LocalTime 클래스가 가장 기본이 된다. now(), of() 로 객체를 생성하며, parse() 메소드를 이용하여 문자열을 날짜/시간으로 파싱할 수 있다.


LocalDateTime ldt = LocalDateTime.now();
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.of(10, 55, 26);

LocalDate date3 = LocalDate.parse("2020-12-12");

출력값:
2020-01-27T21:16:29.040
2020-01-27
10:55:26

특정 필드의 값을 가져올 때에는 .get(), .getXXX() 메소드를 이용한다. Calendar 클래스와 달리 월은 1월부터 1 - 12, 요일은 월요일부터 1 - 7의 값을 가진다.

ChronoField에 정의된 상수를 파라미터로 하여 get() 메소드를 호출할 경우, 해당 클래스가 지원하는 필드여야만 한다. 그렇지 않는다면 UnsupportedTemporalTypeException 이 발생한다. (아래 예시에서 date 객체를 이용하여 시간 range 를 알 수 없다. )


date.getMonth();
date.getMonthValue();
date.get(ChronoField.DAY_OF_WEEK); // 1= 월요일
ChronoField.CLOCK_HOUR_OF_DAY.range();

출력값:
JANUARY
1
1
1 - 24

특정 필드 값을 변경한다면, with(), plus(), minus() 메소드를 사용하면 된다.
with() 를 사용하여 직접 필드값을 수정하거나, plus(), minus() 를 이용하여 특정 필드에 값을 더하거나 뺄 수 있다.

반응형