Dico

[Java] package java.time

Android는 일부 Java 8 언어 기능을 지원하지 않습니다.

해당 글은 EditPlus로 실행하였습니다.

package java.time

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

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

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

  • java.time

     날짜와 시간을 다루는데 필요한 핵심 클래스들을 제공.

     시간(시분초)과 더 큰 개념의 시간(년월일시분초)을 구분하기 위해 time 대신 temporal과 chrono 용어를 사용함.

  • java.time.chrono

     표준(ISO)이 아닌 달력 시스템을 위한 클래스들을 제공.

  • java.time.format

     날짜와 시간을 파싱하고, 형식화하기 위한 클래스들을 제공.

  • java.time.temporal

     날짜와 시간의 필드(field)와 단위(unit)를 위한 클래스들을 제공.

  • java.time.zone

     시간대(time-zone)와 관련된 클래스들을 제공.

핵심 클래스

  • 날짜와 시간이 별도의 클래스로 분리되어 있다.
   LocalDate   날짜를 표현
   LocalTime   시간을 표현
   LocalDateTime   날짜와 시간을 모두 표현
   ZonedDateTime   날짜와 시간, 시간대(time-zone)을 다룬다
  • 날자와 시간의 간격을 표현하는 클래스
   Period   두 날짜간의 차이를 표현
   Duration   시간의 차이를 표현
  • 객체 생성하기

    java.time 패키지에 속한 클래스의 객체를 생성하는 가장 기본적인 방법.

   now()   현재 날짜와 시간을 저장하는 객체를 생성
   of()   해당 필드의 값을 순서대로 지정하여 생성
  • Temporal, TemporalAccessor, TemporalAdjuster 인터페이스를 구현한 클래스

     날짜와 시간을 표현하기 위한 클래스들.

     LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Instant 등

  • TemporalAmount 인터페이스를 구현한 클래스

      Duration, Period

  • TemporalUnit과 TemporalField
   TemporalUnit 인터페이스   날짜와 시간의 단위를 정의해 놓은 것
   열거형 ChronoUnit   TemporalUnit을 구현한 것
   TemporalField 인터페이스   년, 월, 일 등 날짜와 시간의 필드를 정의해 놓은 것
   열겨형 ChronoField   TemporalField를 구현한 것
  • 날짜와 시간에서 특정 필드의 값만 얻기

     get(), get으로 시작하는 이름의 메서드

  • 특정 날짜와 시간에서 지정된 단위의 값을 더하거나 빼기

     plus()/minus()에 값과 함께 열거형 ChronoUnit을 사용한다.

Instant

에포크 타임(EPOCH TIME, 1970-01-01 00:00:00 UTC)부터 경과된 시간을 나노초 단위로 표현한다.

시간을 초 단위와 나노초 단위로 나누어 저장한다.

단일 진법으로 다루기 때문에 계산이 편리하다.

항상 UFC(+00:00)를 기준으로 하기 때문에 LocalTime과 차이가 있을 수 있다.

LocalTime time = LocalTime.now();
Instant now = Instant.now();
System.out.println(time);            // 22:49:14.899
System.out.println(now);             // 2017-08-30T13:49:14.900Z

시간대를 고려해야 하는 경우 OffsetDateTime을 사용하는 것이 나을 수 있다.

  • UFC (Coordinated Universal Time)

     세계 협정시

     1972년 1월 1일부터 시행된 국제 표준시

     GMT(Greenwich Mean Time)와 거의 같지만 좀 더 정확하다.

  • 생성

     now()와 ofEpochSecond()를 사용한다.

static Instant now()
static Instant now(Clock clock)
static Instant ofEpochSecond(long epochSecond, long nanoAdjustment)
static Instant ofEpochSecond(long epochSecond)
Instant now1 = Instant.now();
Instant now2 = Instant.ofEpochSecond(now1.getEpochSecond());
Instant now3 = Instant.ofEpochSecond(now1.getEpochSecond(), now1.getNano());
  • long getEpochSecond()

     필드에 저장된 값을 가져온다.

long epochSec = now1.getEpochSecond();      // 1504101113
int nano = now1.getNano();                  // 577000000
  • long toEpochMilli()

     밀리초 단위의 EPOCh TIME

System.out.println(now.toEpochMilli());     // 1504101172466
  • Instant와 Date간의 변환

     Instant는 기존의 java.util.Date를 대체하기 위한 것이며, JDK1.8부터 Date에 Instant로 변환할 수 있는 새로운 메서드가 추가되었다.

static Date from(Instant instant)      // Instant → Date
Instant toInstant()                    // Date → Instant

java.time API

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