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 (윤년 여부)
Period
와 Duration
Period
와 Duration
는 날짜의 차이를 표현해주는 클래스이다. 차이가 있다면, Period
는 기간(년,월,일)을 구할 때 사용 할 수 있고, Duration
은 Period
보다 세세하게 시간, 분, 초 단위까지 가능하다.
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