Skip to main content

Java 8 - Time API

· 4 min read

Java 8에서는 새로운 날짜 API가 추가되었다.

기존 레거시 코드 중, Date가 있다. 물론 Calender를 사용하면 되지만 Java 8에서 새로운 Time API가 나왔으니 이를 써보도록 하자. 핵심 클래스는 다음과 같다.

  • LocalTime
  • LocalDate
  • LocalDateTime
  • ZoneDateTIme
  • ...

API 맛보기

간단히 API를 살펴보기로 하자. 개인적인 생각이지만 기존 관련 API보다 다양한 메소드를 제공하고 사용하기 편하다는 느낌을 받았다.

현재시간

LocalTime.now(); // ex) 20:00:00
LocalDate.now(); // ex) 2018-03-18
LocalDateTime.now(); // 2017-03-18T20:00:00

초기화

LocalTime.of(20, 0, 0); // 20:00:00
LocalDate.of(2018, 3, 18); // 2017-02-07
LocalDateTime(LocalDate.of(2018, 3, 18), LocalTime.of(20,0,0)); // 2017-02-07T20:00:00

변경

withXXXX()를 이용하여 값을 변경할 수 있다.

LocalDateTime localDateTime = LocalDateTime.now(); //  2018-03-18T20:00:00
localDateTime.withYear(2016); // 2016-03-18T20:00:00

연산

plusXXXX(), minusXXXX()를 이용하여 연산이 가능하다.

LocalDateTime localDateTime = LocalDateTime.now(); //  2018-03-18T20:00:00

localDateTime.plusDays(1); // 2018-03-19T20:00:00
localDateTime.minusDays(1); // 2018-03-17T20:00:00

비교

isAfter(), isBefore(), isEqual() 등 이 있다.

LocalDateTime localDateTime = LocalDateTime.now(); //  2018-03-18T20:00:00
LocalDateTIme compareDateTime = localDateTime.plusDays(1); // 2018-03-19T20:00:00

localDateTime.isBefore(compareDateTime); // true

etc

그 외에도 간단한 메소드들을 제공한다.

LocalDateTime localDateTime = LocalDateTime.now();  // 2017-02-07T20:00:00

localDateTime.getYear(); // 2017
localDateTime.getDayOfYear(); // 38 (년 기준으로 38일째)
localDateTime.getDayOfMonth(); // 7 (달 기준으로 7일째)
localDateTime.getDayOfWeek(); // TUSEDAY (주 기준으로 화 요일)
localDateTime.getMonth(); // FEBRUARY
localDateTime.getMonthValue(); // 2
localDateTime.isLeapYear(); // false (윤년 여부)

PeriodDuration

PeriodDuration는 날짜의 차이를 표현해주는 클래스이다. 차이가 있다면, Period는 기간(년,월,일)을 구할 때 사용 할 수 있고, DurationPeriod보다 세세하게 시간, 분, 초 단위까지 가능하다.

LocalDate localDate = LocalDateTime.now(); //  2017-02-07
LocalDate compareDate = localDate.plusDays(1) // 2017-02-08

// 1.
Period period = localDateTime.until(compareDate)
period.getDays() // 1

// 2.
Period period = Period.between(locaDate, compareDate)
period.getDays() // 1


LocalDateTime localDateTime = LocalDateTime.now() // 2017-02-07T20:00:00
LocalDateTime compareDateTime = localDateTime.plusDays(1) // 2017-02-08T20:00:00

Duration duration = Duration.between(localDateTime, compareDateTime)
duration.toMinutes() // -1 * (24 * 60) -> 하루 차이를 분 단위로 표시

Query

TemporalQuery<R>를 이용하여 사용자 정의 기능을 사용할 수 있다.

// ex) 2월이라면 참, 아니면 거짓
TemporalQuery<Boolean> query = t -> t.get(ChronoField.MONTH_OF_YEAR) == Month.FEBRUARY.getValue();

LocalDateTime localDateTime = LocalDateTime.now() // 2018-03-18T20:00:00
localDateTime.query(query) // true

format

기존(Date, Calender) 클래스에서는 형식 클래스인 SimpleDateFormat로 패턴을 변경했지만, DateTimeFormatter로 패턴을 변경할 수 있습니다.

LocalDate localDate = LocalDate.of(2017, 2, 7) // 2017-02-07
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy년 MM월 dd일")
localDate.format(formatter) // 2017년 02월 07년

참고

이외에도 TemporalAdjusters를 이용하여 보다 세부적인 날짜 처리를 해볼 수 있다. Java8Sample - Java8TimeAPI