Dico

[Java] Class Period

package java.time

Date와 Calendar가 가지고 있던 단점들을 개선한 패키지.

4개의 하위 패키지를 가지고 있다.

날짜나 시간을 변경하는 메서드들은 항상 변경된 새로운 객체를 반환한다. = 불변Immutable

Class Period

날짜의 차이를 계산한다.

년월일을 구분해서 저장한다.

between()

두 날짜의 차이를 계산한다.

start 날짜가 end 날짜 상으로 이전이면 양수로, 이후면 음수로 Period에 저장된다.

static Period between(LocalDate startDateInclusive, LocalDate endDateExclusive)
LocalDate date1 = LocalDate.now();               // 2017-09-13
LocalDate date2 = LocalDate.of(2018, 11, 17);

Period pe = Period.between(date1, date2);        // P1Y2M4D

until()

between()과 거의 같은 일을 한다.

D-day를 구하려는 경우 between()보다 이 메서드를 사용하는 것이 낫다.

Period until(ChronoLocalDate endDateExclusive)             // LocalDate Method
long until(Temporal endExclusive, TemporalUnit unit)       // LocalDate/LocalTime Method
Period pe = date1.until(date2);                       // P1Y2M4D
long Dday = date1.until(date2, ChronoUnit.DAYS);      // 430

get()

특정 필드의 값을 얻는다.

long year = pe.get(ChronoUnit.YEARS);            // 1
long month = pe.get(ChronoUnit.MONTHS);          // 2
long day = pe.get(ChronoUnit.DAYS);              // 4

getXXX()

int getDays()
int getMonths()
int getYears()
  • getUnits()

     Period가 get()에 사용할 수 있는 ChronoUnit의 종류를 알려준다.

List<TemporalUnit> getUnits()          // [Years, Months, Days]

static Period of()

지정된 값으로 Period 객체를 생성한다.

static Period of(int years, int months, int days)
static Period ofDays(int days)
static Period ofMonths(int months)
static Period ofWeeks(int weeks)
static Period ofYears(int years)

Period with()

특정 필드의 값을 변경한다.

Period withDays(int days)
Period withMonths(int months)
Period withYears(int years)

사칙연산

  • plus() / minus()

     다음은 plus 메서드로, minus 메서드는 plus를 minus로 바꾸기만 하면 된다.

Period plus(TemporalAmount amountToAdd)
Period plusDays(long daysToAdd)
Period plusMonths(long monthsToAdd)
Period plusYears(long yearsToAdd)
  • 곱셈
Period multipliedBy(int scalar)
  • 나눗셈

    Period는 날짜의 기간을 표현하기 위한 것으로, 나눗셈을 위한 메서드가 없다.

pe = pe.minusYears(1).multipliedBy(2);      // P4M8D

boolean isNegative()

음수인지 확인하는 메서드

boolean b = pe.isNegative();      // false

boolean isZero()

0인지 확인하는 메서드

boolean b = pe.isZero();         // false

Period negated()

부호를 반대로 변경하는 메서드

boolean b = pe.negated().isNegative();      // true

Period normalized()

월(month)의 값이 12를 넘지 않게 한다.

일(day)의 길이는 일정하지 않아 그대로 놔둔다.

pe = Period.of(1, 13, 32).normalized();     // 1년 13개월 32일 → 2년 1개월 32일

long toTotalMonths()

년월일을 월 단위로 변환해서 반환한다.

일 단위는 무시한다.

LocalDate의 toEpochDay()

Epoch Day인 '1970-01-01'부터 날짜를 세어서 반환한다.

Period를 대신하여 두 날짜간의 일수를 계산할 수 있다.

단, 두 날짜 모두 Epoch Day 이후의 것이어야 한다.

long i = date2.toEpochDay() - date1.toEpochDay();     // 430

Period API

참고 서적: 자바의 정석 3판 2