[Java] Class Duration

Java

(Update : 2017-09-18)

Language :

package java.time

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

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

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

Class Duration

시간의 차이를 계산한다.

between()

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

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

Java

static Duration between(Temporal startInclusive, Temporal endExclusive)

Java

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()

특정 필드의 값을 얻는다.

Java

long get(TemporalUnit unit)

Java

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

getXXX()

  • getUnits()

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

Java

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

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

Java

int getNano()
long getSeconds()

Java

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으로 변환하여 사용한다.

Java

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 객체를 생성한다.

Java

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()

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

Java

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

사칙연산

  • plus() / minus()

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

Java

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)
  • 곱셈

Java

Duration multipliedBy(long multiplicand)
  • 나눗셈

Java

Duration dividedBy(long divisor)

Java

du = du.plusHours(1).dividedBy(60);         // PT-4M-58.8296S

boolean isNegative()

음수인지 확인하는 메서드

Java

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

boolean isZero()

0인지 확인하는 메서드

Java

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

Duration negated()

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

Java

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

Duration abs()

부호를 없애는 메서드

Java

du = du.abs();

toXXX()

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

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

Java

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

LocalTime의 toSecondOfDay(), toNanoOfDay()

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

Java

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

Duration API

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

민갤

Back-End Developer

백엔드 개발자입니다.