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

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

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

API 맛보기

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

현재시간
1
2
3
LocalTime.now(); // ex) 20:00:00
LocalDate.now(); // ex) 2018-03-18
LocalDateTime.now(); // 2017-03-18T20:00:00
초기화
1
2
3
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()를 이용하여 값을 변경할 수 있다.

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

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

1
2
3
4
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() 등 이 있다.

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

localDateTime.isBefore(compareDateTime); // true
etc

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

1
2
3
4
5
6
7
8
9
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보다 세세하게 시간, 분, 초 단위까지 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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>를 이용하여 사용자 정의 기능을 사용할 수 있다.

1
2
3
4
5
// 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로 패턴을 변경할 수 있습니다.

1
2
3
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