자바/모던 자바 인 액션

[모던 자바 인 액션] 12장 새로운 날짜와 시간 API

Rudtjs 2023. 2. 7. 13:06

LocalDate, LocalTime, Duration, Period 클래스

간단한 날짜와 시간 간격을 정의해 보자.

 

LocalDate와 LocalTime

  • LocalDate 인스턴스는 시간을 제외한 날짜를 표현하는 불변 객체다.
  • LocalDate 객체는 어떤 시간대 정보도 포함하지 않는다.
  • 팩토리 메소드 now()는 시스템 시계의 정보를 이용해 현재 날짜 정보를 얻는다.
  • LocalDate와 LocalTime은 게터 메서드를 제공한다.
LocalDate date = LocalDate.of(2017, 9, 21)
date.getYear()

LocalTime time = LocalTime.of(13, 45, 20); // 13:45:20
time.getHour(); // 13
time.getMinute(); // 45
time.getSecond(); // 20

 

날짜와 시간 조합

  • LocalDateTime은 날짜와 시간을 모두 표현할 수 있다.
LocalDateTime dt1 = LocalDateTime.of(2017, Month.SEPTEMBER, 21, 13, 45, 20);
LocalDateTime dt2 = LocalDateTime.of(date, time);

 

Duration과 Period 정의

  • Duration클래스는 between으로 두 시간 객체 사이의 지속시간을 만들 수 있다.
  • Duration과 Period 클래스는 자신의 인스턴스를 만들 수 있도록 다양한 팩토리 메서드를 제공한다.
Period tenDays = Period.between(LocalDate.of(2017, 9, 11), LocalDate.of(2017, 9, 21));

Duration threeMinutes = Duration.ofMinutes(3);
Duration threeMinutes = Duration.of(3, ChronoUnit.MINUTES);

Period tenDays = Period.ofDays(10);
Period threeWeeks = Period.ofWeeks(3);

 

날짜 조정, 파싱, 포메팅

  • withAttribute 메서드는 기존의 LocalDate를 바꾼 버전을 직접 간단하게 만들 수 있다.
  • 다음처럼 지정된 시간을 추가하거나 뺄 수 있다.
LocalDate date1 = LocalDate.of(2017, 9, 21); // 2017-09-21
LocalDate date2 = date1.withYear(2011); // 2011-09-21
LocalDate date3 = date2.withDayOfMonth(25); // 2011-09-25
LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR, 2); // 2011-02-25


LocalDate date1 = LocalDate.of(2017, 9, 21); // 2017-09-21
LocalDate date2 = date1.plusWeek(1); // 2017-09-28
LocalDate date3 = date2.minusYear(6); // 2011-09-28
LocalDate date4 = date3.plus(6, ChronoUnit.MONTHS); // 2012-03-28

plus minus 말고도 다양한 메서드를 지원해 준다.

 

TemporalAdjusters 사용하기

  • 날짜와 시간 API는 다양한 상황에서 사용할 수 있도록 TemporalAdjuster를 제공한다.
  • 필요한 기능이 없을 때는 쉽게 커스텀하여 구현할 수 있다.
LocalDate date1 = LocalDate.of(2014, 3, 18);
LocalDate date2 = date1.with(nextOrSame(DayOfWeek.SUNDAY));
LocalDate date3 = date2.with(lastDayOfMonth());
// 커스텀 구현
@FunctionalInterface
public interface TemporalAdjuster {
  Temporal adjustInto(Temporal temporal);
}