Dico

[Java] Class Duration

package java.time

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

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

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

Class Duration

시간의 차이를 계산한다.

between()

두 시간의 차이를 계산한다.

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

static Duration between(Temporal startInclusive, Temporal endExclusive)
LocalTime time1 = LocalTime.now();               // 23:06:27.295
LocalTime time2 = LocalTime.of(17, 11, 17);

Duration du = Duration.between(time1, time2);    // PT-5H-55M-10.295S

get()

특정 필드의 값을 얻는다.

long get(TemporalUnit unit)
long sec = du.get(ChronoUnit.SECONDS);            // -21421
long nano = du.get(ChronoUnit.NANOS);             // 849000000

getXXX()

  • getUnits()

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

List<TemporalUnit> getUnits()          // [Seconds, Nanos]
  • 불편하고 불안전한 계산

    사용할 수 있는 메서드가 적다 보니 시간 계산이 복잡하다.

int getNano()
long getSeconds()
long hour = du.getSeconds() / 3600;
long min = (du.getSEconds() - hour * 3600) / 60;
long sec = (du.getSEconds() - hour * 3600 - min * 60) % 60;
int nano = du.getNano();

    좀더 안전하고 간단한 방법이 필요할 땐 LocalTime으로 변환하여 사용한다.

LocalTime time = LocalTime.of(0,0).plusSeconds(du.getSeconds());

long hour = time.getHour();
long min =  time.getMinute();
long sec =  time.getSecond();
int nano = du.getNano();

of()

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

static Duration of(long amount, TemporalUnit unit)
static Duration ofDays(long days)
static Duration ofHours(long hours)
static Duration ofMillis(long millis)
static Duration ofMinutes(long minutes)
static Duration ofNanos(long nanos)
static Duration ofSeconds(long seconds, long nanoAdjustment)
static Duration ofSeconds(long seconds)

with()

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

Duration withNanos(int nanoOfSecond)
Duration withSeconds(long seconds)

사칙연산

  • plus() / minus()

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

Duration plus(Duration duration)
Duration plus(long amountToAdd, TemporalUnit unit)
Duration plusDays(long daysToAdd)
Duration plusHours(long hoursToAdd)
Duration plusMillis(long millisToAdd)
Duration plusMinutes(long minutesToAdd)
Duration plusNanos(long nanosToAdd)
Duration plusSeconds(long secondsToAdd)
  • 곱셈
Duration multipliedBy(long multiplicand)
  • 나눗셈
Duration dividedBy(long divisor)
du = du.plusHours(1).dividedBy(60);         // PT-4M-58.8296S

boolean isNegative()

음수인지 확인하는 메서드

boolean b = du.isNegative();      // true

boolean isZero()

0인지 확인하는 메서드

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

Duration negated()

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

boolean b = du.negated().isNegative();      // false

Duration abs()

부호를 없애는 메서드

du = du.abs();

toXXX()

특정 단위로 변환한 결과를 반환하는 메서드

정수(long 타입)으로 반환하여 지정된 단위 이하의 값들은 버려진다.

long toDays()	       // 일 단위로 변환해서 반환
long toHours()	       // 시간 단위로 변환해서 반환
long toMinutes()       // 분 단위로 변환해서 반환
long toMillis()	       // 천분의 일초 단위로 변환해서 반환
long toNanos()	       // 나노초 단위로 변환해서 반환

LocalTime의 toSecondOfDay(), toNanoOfDay()

Duration을 대신하여 시간 차이를 계산할 수 있다.

long i1 = time2.toSecondOfDay() - time1.toSecondOfDay();  // -21653
long i2 = time2.toNanoOfDay() - time1.toNanoOfDay();      // -21653077000000

Duration API

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